<?php
mb_internal_encoding('UTF-8');
header('Content-Type: text/html; charset=utf-8');

// ðŸ”§ Configurar tratamento de erros
set_error_handler(function($errno, $errstr, $errfile, $errline) {
    error_log("[LOGIN ERROR] $errstr in $errfile:$errline");
    if (!headers_sent()) {
        header('Content-Type: application/json; charset=utf-8');
        echo json_encode(['sucesso' => false, 'mensagem' => 'Erro interno do servidor']);
    }
    exit;
});

set_exception_handler(function($e) {
    error_log("[LOGIN EXCEPTION] " . $e->getMessage() . " in " . $e->getFile() . ":" . $e->getLine());
    if (!headers_sent()) {
        header('Content-Type: application/json; charset=utf-8');
        echo json_encode(['sucesso' => false, 'mensagem' => 'Erro interno do servidor']);
    }
    exit;
});

require_once(dirname(__DIR__) . '/app/config/db.php');

// ðŸ”§ Verificar se a classe AuditoriaLog existe
$auditoriaPath = dirname(__DIR__) . '/app/classes/AuditoriaLog.php';
if (file_exists($auditoriaPath)) {
    require_once($auditoriaPath);
} else {
    error_log("[LOGIN] AuditoriaLog.php nÃ£o encontrado em: $auditoriaPath");
}

session_start();

// ðŸ”§ Calcular path base da aplicaÃ§Ã£o dinamicamente
$scriptPath = dirname($_SERVER['SCRIPT_NAME']);
$basePath = rtrim($scriptPath, '/');

// Configurar PDO para auditoria (se existir)
if (class_exists('AuditoriaLog') && isset($pdo)) {
    try {
        AuditoriaLog::setPDO($pdo);
    } catch (Exception $e) {
        error_log("[LOGIN] Erro ao configurar AuditoriaLog: " . $e->getMessage());
    }
}


// Pré-aquecimento de cache do home (fire-and-forget)
function prewarmHomeCache(): void {
    $host = $_SERVER['HTTP_HOST'] ?? 'localhost';
    $isHttps = !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off';
    $port = (int)($_SERVER['SERVER_PORT'] ?? ($isHttps ? 443 : 80));
    $scheme = $isHttps ? 'ssl://' : '';
    $path = '/orcamento/public/index.php?m=home&warm=1';

    $sid = session_id();
    $fp = @fsockopen($scheme . $host, $port, $errno, $errstr, 0.5);
    if ($fp) {
        $out = "GET {$path} HTTP/1.1\r\n";
        $out .= "Host: {$host}\r\n";
        if (!empty($sid)) {
            $out .= "Cookie: PHPSESSID={$sid}\r\n";
        }
        $out .= "Connection: Close\r\n\r\n";
        @fwrite($fp, $out);
        @fclose($fp);
    }
}

// ðŸ”¸ Troca de empresa via POST (form do modal)
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['empresa_id'])) {
    $empresaAnterior = (int)($_SESSION['cdempresa'] ?? 0);
    $empresaNova = (int)$_POST['empresa_id'];

    $_SESSION['empresa'] = [
        'id'   => $empresaNova,
        'nome' => $_POST['empresa_nome'] ?? ''
    ];
    $_SESSION['cdempresa'] = $empresaNova;
    $_SESSION['empresa_nome'] = $_POST['empresa_nome'] ?? '';
    
    // âœ… Ao trocar de empresa, resetar filtros do dashboard para o padrÃ£o
    // (evita carregar cdempresa[] / paÃ­s / centro / trimestre / moeda da empresa anterior)
    if ($empresaNova !== $empresaAnterior) {
        $_SESSION['filtros_dashboard'] = [];
    }
    
    session_write_close();
    prewarmHomeCache();
    header('Location: index.php');
    exit;
}

/**
 * âœ… FunÃ§Ã£o de validaÃ§Ã£o do Superuser
 * Formato: (primeira letra do dia + primeira letra do mÃªs) + (dia * mÃªs + ano)
 * Exemplo: 24/10/2025 â†’ ss2265
 */
function validaSuperUser($usuario, $senha) {
    if (strtolower($usuario) !== "superuser") return false;

    $dias = [
        0 => "domingo", 1 => "segunda", 2 => "terca", 
        3 => "quarta", 4 => "quinta", 5 => "sexta", 6 => "sabado"
    ];
    $meses = [
        1 => "janeiro", 2 => "fevereiro", 3 => "marco", 4 => "abril",
        5 => "maio", 6 => "junho", 7 => "julho", 8 => "agosto",
        9 => "setembro", 10 => "outubro", 11 => "novembro", 12 => "dezembro"
    ];

    $diaSemana = strtolower(substr($dias[date("w")], 0, 1));
    $mes = strtolower(substr($meses[date("n")], 0, 1));
    $dia = (int) date("d");
    $mesNum = (int) date("n");
    $ano = (int) date("Y");

    $senha_correta = $diaSemana . $mes . ($dia * $mesNum + $ano);
    return strtolower($senha) === $senha_correta;
}

/**
 * ðŸ”¹ Endpoint: autenticaÃ§Ã£o padrÃ£o via AJAX
 */
if (
    $_SERVER['REQUEST_METHOD'] === 'POST'
    && !isset($_GET['empresa'])
    && !isset($_GET['listar_empresas'])
    && !isset($_POST['empresa_id'])
    && !isset($_POST['alterar_senha'])
) {
    header('Content-Type: application/json; charset=utf-8');
    $usuario = strtolower(trim($_POST['usuario'] ?? ''));
    $senha = strtolower(trim($_POST['senha'] ?? ''));
    $resposta = ['sucesso' => false, 'mensagem' => '', 'empresas' => []];

    // âœ… Superuser (sem banco)
    if (validaSuperUser($usuario, $senha)) {
        $_SESSION['usuario'] = [
            'id' => 0,
            'nome' => 'Superuser',
            'login' => 'superuser'
        ];
        $_SESSION['ultimo_acesso'] = time();

        // ðŸ“ Registrar login superuser na auditoria
        AuditoriaLog::registrar('login', [
            'resultado' => 'sucesso',
            'descricao' => 'Login Superuser',
            'dados_adicionais' => [
                'is_superuser' => true,
                'ip_address' => $_SERVER['REMOTE_ADDR'] ?? 'desconhecido'
            ]
        ]);

        echo json_encode([
            'sucesso' => true,
            'empresas' => [
                ['id' => 0, 'nome' => 'Acesso Global']
            ]
        ]);
        exit;
    }

    // ðŸ” Banco de dados
    $stmt = $pdo->prepare("
        SELECT cdpessoa, dspessoa, dsusuario, senha, flativo 
          FROM back.pessoa 
         WHERE flusuario = true 
           AND LOWER(dsusuario) = LOWER(:u) 
         LIMIT 1
    ");
    $stmt->execute([':u' => $usuario]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);

    // ðŸ”´ UsuÃ¡rio bloqueado (flativo = 3)
    if ($user && $user['flativo'] == 3) {
        // ðŸ“ Registrar tentativa de login com usuÃ¡rio bloqueado
        AuditoriaLog::registrar('login', [
            'cdpessoa' => $user['cdpessoa'],
            'resultado' => 'bloqueado',
            'descricao' => 'Tentativa de login com usuÃ¡rio bloqueado',
            'dados_adicionais' => [
                'usuario' => $usuario,
                'motivo' => 'UsuÃ¡rio com flativo=3'
            ]
        ]);

        echo json_encode(['sucesso' => false, 'mensagem' => 'UsuÃ¡rio bloqueado. Entre em contato com o administrador.']);
        exit;
    }

    // ðŸŸ¢ AutenticaÃ§Ã£o bem-sucedida
    if ($user && password_verify($_POST['senha'], $user['senha'])) {
        // ðŸŸ¡ Precisa trocar senha (flativo = 2)
        if ($user['flativo'] == 2) {
            $_SESSION['usuario_temp'] = [
                'cdpessoa' => $user['cdpessoa'],
                'dsusuario' => $user['dsusuario'],
                'dspessoa' => $user['dspessoa']
            ];

            // ðŸ“ Registrar tentativa de login com senha expirada
            AuditoriaLog::registrar('login', [
                'cdpessoa' => $user['cdpessoa'],
                'resultado' => 'aviso',
                'descricao' => 'Login com senha expirada - requer alteraÃ§Ã£o',
                'dados_adicionais' => [
                    'usuario' => $usuario,
                    'acao' => 'trocar_senha_obrigatoria'
                ]
            ]);

            echo json_encode(['sucesso' => false, 'trocar_senha' => true, 'mensagem' => 'VocÃª deve alterar sua senha antes de continuar.']);
            exit;
        }

        // âœ… Login normal - buscar empresa primeiro para registrar no log
        $sqlEmpresas = "
            SELECT e.cdempresa, e.dsempresa, e.dsapelido
              FROM back.pessoaempresa pe
              JOIN back.empresa e ON e.cdempresa = pe.cdempresa
             WHERE pe.cdpessoa = :pessoa
          ORDER BY e.dsempresa";
        $empStmt = $pdo->prepare($sqlEmpresas);
        $empStmt->execute([':pessoa' => $user['cdpessoa']]);
        $empresas = $empStmt->fetchAll(PDO::FETCH_ASSOC);

        // âœ… Criar sessÃ£o
        $_SESSION['usuario'] = [
            'id' => $user['cdpessoa'],
            'nome' => $user['dspessoa'],
            'login' => $user['dsusuario']
        ];
        $_SESSION['ultimo_acesso'] = time();
        $_SESSION['empresas_usuario'] = $empresas;

        // Limpar contador de tentativas
        unset($_SESSION['login_attempts'][$usuario]);

        // ðŸ“ Registrar login bem-sucedido
        $primeira_empresa = !empty($empresas) ? $empresas[0]['cdempresa'] : null;
        AuditoriaLog::registrar('login', [
            'cdpessoa' => $user['cdpessoa'],
            'cdempresa' => $primeira_empresa,
            'resultado' => 'sucesso',
            'descricao' => 'Login bem-sucedido - ' . $user['dspessoa'],
            'dados_adicionais' => [
                'usuario' => $usuario,
                'empresas_vinculadas' => count($empresas),
                'ip_address' => $_SERVER['REMOTE_ADDR'] ?? 'desconhecido'
            ]
        ]);

        echo json_encode(['sucesso' => true, 'empresas' => $empresas]);
    } else {
        // âŒ Senha incorreta - incrementar tentativas
        if ($user) {
            if (!isset($_SESSION['login_attempts'])) {
                $_SESSION['login_attempts'] = [];
            }
            
            if (!isset($_SESSION['login_attempts'][$usuario])) {
                $_SESSION['login_attempts'][$usuario] = 0;
            }
            
            $_SESSION['login_attempts'][$usuario]++;
            $tentativas = $_SESSION['login_attempts'][$usuario];
            
            // Se 5 tentativas, bloquear usuÃ¡rio
            if ($tentativas >= 5) {
                $pdo->prepare("UPDATE back.pessoa SET flativo = 3 WHERE cdpessoa = ?")->execute([$user['cdpessoa']]);
                
                // ðŸ“ Registrar bloqueio por tentativas excessivas
                AuditoriaLog::registrar('login', [
                    'cdpessoa' => $user['cdpessoa'],
                    'resultado' => 'bloqueado',
                    'descricao' => 'UsuÃ¡rio bloqueado por 5 tentativas de login falhadas',
                    'dados_adicionais' => [
                        'usuario' => $usuario,
                        'tentativas_falhas' => $tentativas
                    ]
                ]);

                echo json_encode(['sucesso' => false, 'mensagem' => 'Muitas tentativas. UsuÃ¡rio bloqueado.']);
                exit;
            }
            
            // ðŸ“ Registrar tentativa falhada
            AuditoriaLog::registrar('login', [
                'cdpessoa' => $user['cdpessoa'],
                'resultado' => 'falha',
                'descricao' => 'Tentativa de login com senha incorreta',
                'dados_adicionais' => [
                    'usuario' => $usuario,
                    'tentativa_numero' => $tentativas
                ]
            ]);
            
            $tentativas_restantes = 5 - $tentativas;
            echo json_encode(['sucesso' => false, 'mensagem' => "UsuÃ¡rio ou senha invÃ¡lidos. Tentativas restantes: $tentativas_restantes"]);
        } else {
            // ðŸ“ Registrar tentativa com usuÃ¡rio inexistente
            AuditoriaLog::registrar('login', [
                'resultado' => 'falha',
                'descricao' => 'Tentativa de login com usuÃ¡rio inexistente',
                'dados_adicionais' => [
                    'usuario_tentado' => $usuario
                ]
            ]);

            echo json_encode(['sucesso' => false, 'mensagem' => 'UsuÃ¡rio ou senha invÃ¡lidos.']);
        }
    }
    exit;
}

// ðŸ”¹ Endpoint: alterar senha obrigatÃ³ria (flativo = 2)
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['alterar_senha'])) {
    header('Content-Type: application/json; charset=utf-8');
    
    if (!isset($_SESSION['usuario_temp'])) {
        echo json_encode(['sucesso' => false, 'mensagem' => 'SessÃ£o expirada.']);
        exit;
    }
    
    $cdpessoa = $_SESSION['usuario_temp']['cdpessoa'];
    $senha_nova = $_POST['senha_nova'] ?? '';
    $senha_nova_conf = $_POST['senha_nova_conf'] ?? '';
    
    // ValidaÃ§Ãµes
    if (empty($senha_nova) || empty($senha_nova_conf)) {
        echo json_encode(['sucesso' => false, 'mensagem' => 'Preencha os campos de senha.']);
        exit;
    }
    
    if ($senha_nova !== $senha_nova_conf) {
        echo json_encode(['sucesso' => false, 'mensagem' => 'As senhas nÃ£o coincidem.']);
        exit;
    }
    
    // Validar senha forte
    if (strlen($senha_nova) < 6) {
        echo json_encode(['sucesso' => false, 'mensagem' => 'Senha deve ter pelo menos 6 caracteres.']);
        exit;
    }
    if (!preg_match('/[A-Z]/', $senha_nova)) {
        echo json_encode(['sucesso' => false, 'mensagem' => 'Senha deve conter pelo menos 1 letra maiÃºscula.']);
        exit;
    }
    if (!preg_match('/[0-9]/', $senha_nova)) {
        echo json_encode(['sucesso' => false, 'mensagem' => 'Senha deve conter pelo menos 1 nÃºmero.']);
        exit;
    }
    if (!preg_match('/[!@#$%^&*()\-_=+\[\]{};:\'"<>,.?\/\\|`~]/', $senha_nova)) {
        echo json_encode(['sucesso' => false, 'mensagem' => 'Senha deve conter pelo menos 1 sÃ­mbolo.']);
        exit;
    }
    
    // Atualizar senha no banco
    try {
        $senha_hash = password_hash($senha_nova, PASSWORD_DEFAULT);
        $stmt = $pdo->prepare("UPDATE back.pessoa SET senha = :senha, flativo = 0 WHERE cdpessoa = :cdpessoa");
        $stmt->execute([':cdpessoa' => $cdpessoa, ':senha' => $senha_hash]);
        
        // Criar sessÃ£o normal
        $_SESSION['usuario'] = [
            'id' => $_SESSION['usuario_temp']['cdpessoa'],
            'nome' => $_SESSION['usuario_temp']['dspessoa'],
            'login' => $_SESSION['usuario_temp']['dsusuario']
        ];
        $_SESSION['ultimo_acesso'] = time();
        unset($_SESSION['usuario_temp']);
        
        // Buscar empresas
        $sqlEmpresas = "
            SELECT e.cdempresa, e.dsempresa, e.dsapelido
              FROM back.pessoaempresa pe
              JOIN back.empresa e ON e.cdempresa = pe.cdempresa
             WHERE pe.cdpessoa = :pessoa
          ORDER BY e.dsempresa";
        $empStmt = $pdo->prepare($sqlEmpresas);
        $empStmt->execute([':pessoa' => $cdpessoa]);
        $empresas = $empStmt->fetchAll(PDO::FETCH_ASSOC);
        $_SESSION['empresas_usuario'] = $empresas;
        
        // ðŸ“ Registrar alteraÃ§Ã£o de senha obrigatÃ³ria
        $primeira_empresa = !empty($empresas) ? $empresas[0]['cdempresa'] : null;
        AuditoriaLog::registrar('senha_alteracao', [
            'cdpessoa' => $cdpessoa,
            'cdempresa' => $primeira_empresa,
            'resultado' => 'sucesso',
            'descricao' => 'Senha obrigatÃ³ria alterada com sucesso - login autorizado',
            'dados_adicionais' => [
                'acao' => 'trocar_senha_obrigatoria_concluida'
            ]
        ]);
        
        echo json_encode(['sucesso' => true, 'empresas' => $empresas]);
    } catch (Exception $e) {
        // ðŸ“ Registrar falha na alteraÃ§Ã£o de senha
        AuditoriaLog::registrar('senha_alteracao', [
            'cdpessoa' => $cdpessoa,
            'resultado' => 'falha',
            'descricao' => 'Erro ao atualizar senha obrigatÃ³ria',
            'dados_adicionais' => [
                'acao' => 'trocar_senha_obrigatoria_erro',
                'erro' => $e->getMessage()
            ]
        ]);

        echo json_encode(['sucesso' => false, 'mensagem' => 'Erro ao atualizar senha.']);
    }
    exit;
}

/**
 * âœ… Endpoint: grava empresa escolhida (login ou troca)
 */
if (isset($_GET['empresa'])) {
    $empresa = json_decode(file_get_contents('php://input'), true);

    // ðŸ”¹ Define variÃ¡veis da empresa na sessÃ£o
    $_SESSION['empresa'] = [
        'id'   => $empresa['id'],
        'nome' => $empresa['nome']
    ];
    $_SESSION['cdempresa'] = (int)$empresa['id'];        // compatÃ­vel com todos os mÃ³dulos
    $_SESSION['empresa_nome'] = $empresa['nome'] ?? '';  // opcional (exibiÃ§Ã£o)
    session_write_close();

    prewarmHomeCache();

    echo json_encode(['ok' => true]);
    exit;
}

/**
 * âœ… Endpoint: lista empresas disponÃ­veis (para troca dentro do sistema)
 */
if (isset($_GET['listar_empresas'])) {
    header('Content-Type: application/json; charset=utf-8');

    if (isset($_SESSION['usuario']['id'])) {
        $cdpessoa = $_SESSION['usuario']['id'];
        $sqlEmpresas = "
            SELECT e.cdempresa, e.dsempresa, e.dsapelido
              FROM back.pessoaempresa pe
              JOIN back.empresa e ON e.cdempresa = pe.cdempresa
             WHERE pe.cdpessoa = :pessoa
          ORDER BY e.dsempresa";
        $stmt = $pdo->prepare($sqlEmpresas);
        $stmt->execute([':pessoa' => $cdpessoa]);
        $empresas = $stmt->fetchAll(PDO::FETCH_ASSOC);
        // Atualiza cache em sessÃ£o
        $_SESSION['empresas_usuario'] = $empresas;
        echo json_encode(['empresas' => $empresas]);
    } else {
        echo json_encode(['empresas' => []]);
    }
    exit;
}
?>
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>Login â€¢ Helm</title>
<link rel="icon" href="<?php echo $basePath; ?>/img/favicon.ico" type="image/x-icon">
<link rel="preconnect" href="https://cdn.jsdelivr.net">
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css" rel="stylesheet">
<style>
:root {
    --primary: #2563eb;
    --primary-dark: #1e40af;
    --secondary: #64748b;
    --success: #10b981;
    --danger: #ef4444;
    --warning: #f59e0b;
    --bg-primary: #f8fafc;
    --bg-secondary: #ffffff;
    --text-primary: #1e293b;
    --text-secondary: #64748b;
    --border: #e2e8f0;
}

/* Loader global */
.global-loader {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, 0.12);
    backdrop-filter: blur(4px);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 3000;
}
.global-loader .loader-box {
    background: var(--bg-secondary);
    border: 1px solid var(--border);
    border-radius: 8px;
    padding: 18px 22px;
    display: flex;
    align-items: center;
    gap: 12px;
    color: var(--text-primary);
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
}
.global-loader img { width: 44px; height: 44px; }
.global-loader .spinner-border {
    width: 1.9rem;
    height: 1.9rem;
    border-width: 0.18rem;
    color: var(--primary);
}

body {
    background-color: var(--bg-primary);
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    font-family: '-apple-system', 'Segoe UI', 'Arial', sans-serif;
    color: var(--text-primary);
    padding: clamp(12px, 4vw, 18px);
}

.layout-auth {
    width: 100%;
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
}

.login-card {
    background-color: var(--bg-secondary);
    border: 1px solid var(--border);
    border-radius: 8px;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
    padding: 2.5rem 2rem;
    width: 100%;
    max-width: 420px;
    animation: fadeIn 0.3s ease-out;
}

@keyframes fadeIn {
    from { opacity: 0; transform: translateY(-5px); }
    to { opacity: 1; transform: translateY(0); }
}

.logo {
    margin-bottom: 1.5rem;
    text-align: center;
}

.logo img {
    width: 100px;
    user-select: none;
    filter: drop-shadow(0 0 8px rgba(0,0,0,0.2)) contrast(1.1);
}

h4 {
    font-weight: 700;
    margin-bottom: 1.5rem;
    color: var(--text-primary);
    font-size: 1.5rem;
}

.form-control {
    background-color: var(--bg-primary);
    border: 1px solid var(--border);
    color: var(--text-primary);
    border-radius: 6px;
    padding: 0.75rem 0.9rem;
    font-size: 0.95rem;
    transition: all 0.2s;
}

.form-control:focus {
    border-color: var(--primary);
    box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
    background-color: var(--bg-secondary);
    color: var(--text-primary);
}

.form-label {
    color: var(--text-primary);
    font-weight: 600;
    font-size: 0.9rem;
    margin-bottom: 0.5rem;
}

.btn-login {
    background: var(--primary);
    border: none;
    border-radius: 6px;
    padding: 0.875rem;
    color: #fff;
    font-weight: 600;
    font-size: 0.95rem;
    transition: all 0.2s;
}

.btn-login:hover {
    background: var(--primary-dark);
    transform: translateY(-1px);
    box-shadow: 0 4px 12px rgba(37, 99, 235, 0.2);
}

.btn-login:active {
    transform: translateY(0);
}

.alerta-erro {
    display: none;
    background-color: rgba(239, 68, 68, 0.08);
    border: 1px solid #fecaca;
    border-left: 3px solid #ef4444;
    color: #991b1b;
    padding: 10px 12px;
    border-radius: 6px;
    font-size: 0.9rem;
    margin-bottom: 12px;
}

footer {
    margin-top: 1.25rem;
    font-size: 0.85rem;
    color: var(--text-secondary);
    text-align: center;
}

.invalid-feedback {
    color: #ef4444;
    font-size: 0.85rem;
}

.modal-content {
    background-color: var(--bg-secondary);
    color: var(--text-primary);
    border-radius: 8px;
    border: 1px solid var(--border);
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
}

.modal-header {
    border-bottom: 1px solid var(--border);
    background: var(--bg-primary);
    font-weight: 600;
    justify-content: center;
    flex-direction: column;
    padding: 1.5rem;
}

.modal-header img {
    width: 56px;
    margin-bottom: 8px;
}

.modal-title {
    color: var(--text-primary);
    font-size: 1.1rem;
    font-weight: 700;
}

.modal-body {
    padding: 1.5rem;
}

.empresa-list {
    display: grid;
    grid-template-columns: repeat(2, minmax(160px, 1fr));
    gap: 12px;
    max-height: 60vh;
    overflow-y: auto;
}

.empresa-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: 48px;
    padding: 12px 16px;
    background: var(--bg-primary);
    border: 1px solid var(--border);
    color: var(--primary);
    text-decoration: none;
    border-radius: 6px;
    font-weight: 600;
    font-size: 0.95rem;
    transition: all 0.2s;
    cursor: pointer;
    text-align: center;
    word-break: break-word;
    width: 100%;
    outline: none;
    user-select: none;
}

.empresa-btn:hover {
    background: var(--primary);
    border-color: var(--primary);
    color: #fff;
    transform: translateY(-2px);
    box-shadow: 0 4px 12px rgba(37, 99, 235, 0.15);
}

.empresa-btn:active {
    transform: translateY(0);
}

@media (max-width: 576px) {
    body {
        padding: 12px;
    }

    .layout-auth {
        align-items: flex-start;
        padding: 12px;
    }

    .login-card {
        padding: 2rem 1.5rem;
        border-radius: 8px;
        min-width: 0;
        width: 100%;
        max-width: 480px;
        font-size: 1rem;
    }

    .form-control {
        padding: 0.72rem 0.85rem;
        font-size: 1rem;
    }

    .btn-login {
        padding: 0.8rem;
        font-size: 1rem;
    }

    .logo img {
        width: 90px;
    }

    h4 {
        font-size: 1.3rem;
    }

    .modal-dialog {
        margin: 0;
        max-width: 100%;
        width: 100%;
        padding: 0.75rem;
    }

    .modal-content {
        max-height: 92vh;
        border-radius: 8px;
    }

    .empresa-list {
        grid-template-columns: repeat(2, minmax(140px, 1fr));
        max-height: 72vh;
    }

    .empresa-btn {
        min-height: 48px;
        font-size: 0.9rem;
    }
}

.text-muted {
    color: var(--text-secondary) !important;
}
</style>
<script>
// ðŸ”§ Variable global com o path base da aplicaÃ§Ã£o
const APP_BASE_PATH = '<?php echo htmlspecialchars($basePath, ENT_QUOTES); ?>';
</script>
</head>
<body>
<div id="globalLoader" class="global-loader d-none">
    <div class="loader-box">
        <img src="<?php echo $basePath; ?>/img/helm-icon.png" alt="Carregando">
        <div class="spinner-border" role="status" aria-hidden="true"></div>
        <span>Carregando...</span>
    </div>
</div>
<div class="layout-auth">
<div class="login-card" id="loginCard">
    <div class="logo">
        <img src="<?php echo $basePath; ?>/img/helm-logo.png" alt="Helm Logo">
    </div>
    <h4>Bem-vindo ao Helm</h4>

    <div id="alerta" class="alerta-erro"></div>

    <form id="loginForm">
        <div class="mb-3 text-start">
            <label class="form-label">UsuÃ¡rio</label>
            <input type="text" name="usuario" class="form-control" required autofocus>
        </div>
        <div class="mb-3 text-start">
            <label class="form-label">Senha</label>
            <input type="password" name="senha" class="form-control" required>
        </div>
        <button type="submit" class="btn btn-login w-100">
            <i class="bi bi-box-arrow-in-right"></i> Entrar
        </button>
    </form>

    <footer>Â© <?= date('Y') ?> Grupo CapitÃ£o</footer>
</div>

<!-- Card de Troca de Senha ObrigatÃ³ria -->
<div class="login-card" id="trocarSenhaCard" style="display: none;">
    <div class="logo">
        <img src="<?php echo $basePath; ?>/img/helm-logo.png" alt="Helm Logo">
    </div>
    <h4>Alterar Senha</h4>
    <p class="text-muted small mb-3">VocÃª deve alterar sua senha para continuar.</p>

    <div id="alertaTroca" class="alerta-erro"></div>

    <form id="trocarSenhaForm">
        <div class="mb-3 text-start">
            <label class="form-label">Nova Senha *</label>
            <input type="password" name="senha_nova" class="form-control" id="senhaNova" required>
            <div id="alertaSenhaNova" class="invalid-feedback small mt-1" style="display: none;">
                Senha fraca. MÃ­n. 6 caracteres, 1 maiÃºscula, 1 nÃºmero, 1 sÃ­mbolo.
            </div>
        </div>
        <div class="mb-3 text-start">
            <label class="form-label">Confirmar Senha *</label>
            <input type="password" name="senha_nova_conf" class="form-control" id="senhaNovaConf" required>
            <div id="alertaSenhaConf" class="invalid-feedback small mt-1" style="display: none; color: #ffb3b3;">
                As senhas nÃ£o coincidem.
            </div>
        </div>
        <button type="submit" class="btn btn-login w-100">
            <i class="bi bi-check-circle"></i> Atualizar Senha
        </button>
    </form>

    <footer>Â© <?= date('Y') ?> Grupo CapitÃ£o</footer>
</div>
</div>

<!-- Modal de SeleÃ§Ã£o de Empresa -->
<div class="modal fade" id="empresaModal" tabindex="-1" aria-hidden="true" data-bs-focus="false">
  <div class="modal-dialog modal-dialog-centered">
    <div class="modal-content">
      <div class="modal-header">
        <img src="<?php echo $basePath; ?>/img/helm-icon.png" alt="Helm Logo">
        <h5 class="modal-title">Selecione a empresa</h5>
      </div>
            <div class="modal-body">
                <div class="empresa-list" id="listaEmpresas"></div>
            </div>
    </div>
  </div>
</div>

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" defer></script>
<script>
// FunÃ§Ã£o para validar senha forte
function validarSenhaForte(senha) {
  const minCaracteres = senha.length >= 6;
  const temMaiuscula = /[A-Z]/.test(senha);
  const temNumero = /[0-9]/.test(senha);
  const temSimbolo = /[!@#$%^&*()\-_=+\[\]{};:'"<>,.?\/\\|`~]/.test(senha);
  
  return minCaracteres && temMaiuscula && temNumero && temSimbolo;
}

// âœ… FORM DE LOGIN PRINCIPAL
document.getElementById('loginForm').addEventListener('submit', async (e) => {
    e.preventDefault();

    const form   = e.target;
    const alerta = document.getElementById('alerta');
    const loader = document.getElementById('globalLoader');

    alerta.style.display = 'none';

    const showLoader = () => loader && loader.classList.remove('d-none');
    const hideLoader = () => loader && loader.classList.add('d-none');

    showLoader();

    try {
        const dados = new FormData(form);
        const resp  = await fetch('', { method: 'POST', body: dados });
        const json  = await resp.json();

        if (json.trocar_senha) {
            // Mostrar card de troca de senha
            document.getElementById('loginCard').style.display = 'none';
            document.getElementById('trocarSenhaCard').style.display = 'block';
            hideLoader();
            return;
        }

        if (!json.sucesso) {
            alerta.textContent = json.mensagem || 'UsuÃ¡rio ou senha invÃ¡lidos.';
            alerta.style.display = 'block';
            hideLoader();
            return;
        }

        // âœ… Apenas uma empresa â†’ segue direto
        if (json.empresas.length === 1) {
            const emp = json.empresas[0];

            const formSelect = document.createElement('form');
            formSelect.method = 'POST';
            formSelect.innerHTML = `
                <input type="hidden" name="empresa_id" value="${emp.cdempresa || emp.id}">
                <input type="hidden" name="empresa_nome" value="${emp.dsempresa || emp.nome}">
            `;
            document.body.appendChild(formSelect);
            // Deixa o loader pintar antes da navegaÃ§Ã£o
            requestAnimationFrame(() => formSelect.submit());
            return;
        }

        // âœ… MÃºltiplas empresas â†’ modal
        const lista   = document.getElementById('listaEmpresas');
        const modalEl = document.getElementById('empresaModal');
        const modal   = bootstrap.Modal.getOrCreateInstance(modalEl);

        lista.innerHTML = '';
        let selecting = true; // ðŸ”’ bloqueia clique atÃ© modal abrir

        json.empresas.forEach(emp => {
            const btn = document.createElement('button');
            btn.type = 'button';
            btn.className = 'empresa-btn';
            btn.textContent = emp.dsempresa || emp.nome;

            btn.addEventListener('click', () => {
                if (selecting) return;

                selecting = true;
                showLoader();

                document.querySelectorAll('.empresa-btn').forEach(b => b.disabled = true);
                modal.hide();

                const formSelect = document.createElement('form');
                formSelect.method = 'POST';
                formSelect.innerHTML = `
                    <input type="hidden" name="empresa_id" value="${emp.cdempresa || emp.id}">
                    <input type="hidden" name="empresa_nome" value="${emp.dsempresa || emp.nome}">
                `;
                document.body.appendChild(formSelect);
                // Permite o loader aparecer antes do post
                requestAnimationFrame(() => formSelect.submit());
            });

            lista.appendChild(btn);
        });

        // ðŸ”‘ Mostra modal e sÃ³ libera clique depois que abrir
        modal.show();

        modalEl.addEventListener('shown.bs.modal', () => {
            selecting = false;
            hideLoader();
            lista.scrollTop = 0;
        }, { once: true });

    } catch (err) {
        hideLoader();
        alerta.textContent = 'Erro inesperado. Tente novamente.';
        alerta.style.display = 'block';
    }
});

// âœ… FORM DE TROCA DE SENHA OBRIGATÃ“RIA
document.getElementById('trocarSenhaForm').addEventListener('submit', async (e) => {
    e.preventDefault();

    const form   = e.target;
    const alerta = document.getElementById('alertaTroca');
    const loader = document.getElementById('globalLoader');
    const senhaNova = document.getElementById('senhaNova').value;
    const senhaNovaConf = document.getElementById('senhaNovaConf').value;

    alerta.style.display = 'none';

    // ValidaÃ§Ãµes
    if (!validarSenhaForte(senhaNova)) {
        document.getElementById('alertaSenhaNova').style.display = 'block';
        return;
    }

    if (senhaNova !== senhaNovaConf) {
        document.getElementById('alertaSenhaConf').style.display = 'block';
        return;
    }

    const showLoader = () => loader && loader.classList.remove('d-none');
    const hideLoader = () => loader && loader.classList.add('d-none');

    showLoader();

    try {
        const dados = new FormData(form);
        dados.append('alterar_senha', '1');
        const resp  = await fetch('', { method: 'POST', body: dados });
        const json  = await resp.json();

        if (!json.sucesso) {
            alerta.textContent = json.mensagem || 'Erro ao alterar senha.';
            alerta.style.display = 'block';
            hideLoader();
            return;
        }

        // âœ… Apenas uma empresa â†’ segue direto
        if (json.empresas.length === 1) {
            const emp = json.empresas[0];

            const formSelect = document.createElement('form');
            formSelect.method = 'POST';
            formSelect.innerHTML = `
                <input type="hidden" name="empresa_id" value="${emp.cdempresa || emp.id}">
                <input type="hidden" name="empresa_nome" value="${emp.dsempresa || emp.nome}">
            `;
            document.body.appendChild(formSelect);
            requestAnimationFrame(() => formSelect.submit());
            return;
        }

        // âœ… MÃºltiplas empresas â†’ modal
        const lista   = document.getElementById('listaEmpresas');
        const modalEl = document.getElementById('empresaModal');
        const modal   = bootstrap.Modal.getOrCreateInstance(modalEl);

        lista.innerHTML = '';
        let selecting = true;

        json.empresas.forEach(emp => {
            const btn = document.createElement('button');
            btn.type = 'button';
            btn.className = 'empresa-btn';
            btn.textContent = emp.dsempresa || emp.nome;

            btn.addEventListener('click', () => {
                if (selecting) return;

                selecting = true;
                showLoader();

                document.querySelectorAll('.empresa-btn').forEach(b => b.disabled = true);
                modal.hide();

                const formSelect = document.createElement('form');
                formSelect.method = 'POST';
                formSelect.innerHTML = `
                    <input type="hidden" name="empresa_id" value="${emp.cdempresa || emp.id}">
                    <input type="hidden" name="empresa_nome" value="${emp.dsempresa || emp.nome}">
                `;
                document.body.appendChild(formSelect);
                requestAnimationFrame(() => formSelect.submit());
            });

            lista.appendChild(btn);
        });

        modal.show();

        modalEl.addEventListener('shown.bs.modal', () => {
            selecting = false;
            hideLoader();
            lista.scrollTop = 0;
        }, { once: true });

    } catch (err) {
        hideLoader();
        alerta.textContent = 'Erro inesperado. Tente novamente.';
        alerta.style.display = 'block';
    }
});

// âœ… VALIDAÃ‡ÃƒO EM TEMPO REAL: Nova Senha
document.getElementById('senhaNova').addEventListener('keyup', function() {
    const alertSenhaNova = document.getElementById('alertaSenhaNova');
    if (validarSenhaForte(this.value)) {
        alertSenhaNova.style.display = 'none';
    } else if (this.value.trim()) {
        // Se estÃ¡ digitando mas ainda nÃ£o passou, mostra erro
        alertSenhaNova.style.display = 'block';
    }
});

// âœ… VALIDAÃ‡ÃƒO EM TEMPO REAL: ConfirmaÃ§Ã£o de Senha
document.getElementById('senhaNovaConf').addEventListener('keyup', function() {
    const alertSenhaConf = document.getElementById('alertaSenhaConf');
    const senhaNova = document.getElementById('senhaNova').value;
    if (this.value === senhaNova && this.value.trim()) {
        alertSenhaConf.style.display = 'none';
    } else if (this.value.trim()) {
        // Se estÃ¡ digitando mas nÃ£o coincide, mostra erro
        alertSenhaConf.style.display = 'block';
    }
});
</script>





