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

// Carregar AuditoriaLog se existir
$auditoriaPath = dirname(__DIR__) . '/app/classes/AuditoriaLog.php';
if (file_exists($auditoriaPath)) {
    require_once($auditoriaPath);
}

session_set_cookie_params([
    'lifetime' => 0,
    'path'     => '/',
    'secure'   => isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off',
    'httponly'  => true,
    'samesite' => 'Lax'
]);
session_start();

// Calcular path base da aplicação dinamicamente
$scriptPath = dirname($_SERVER['SCRIPT_NAME']);
$basePath = rtrim($scriptPath, '/');

// Configurar PDO para auditoria
if (class_exists('AuditoriaLog') && isset($pdo)) {
    AuditoriaLog::setPDO($pdo);
}

// 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://' : '';
    $scriptName = $_SERVER['SCRIPT_NAME'] ?? '/index.php';
    $baseDir = dirname($scriptName);
    $path = rtrim($baseDir, '/') . '/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
    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');
    $usuario = strtolower(trim($_POST['usuario'] ?? ''));
    $senha = strtolower(trim($_POST['senha'] ?? ''));
    $resposta = ['sucesso' => false, 'mensagem' => '', 'empresas' => []];

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

        // Registrar login superuser na auditoria
        if (class_exists('AuditoriaLog')) {
            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, visao_padrao 
          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) {
        if (class_exists('AuditoriaLog')) {
            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'],
                'visao_padrao' => $user['visao_padrao']
            ];

            if (class_exists('AuditoriaLog')) {
                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_regenerate_id(true);
        $_SESSION['usuario'] = [
            'id' => $user['cdpessoa'],
            'nome' => $user['dspessoa'],
            'login' => $user['dsusuario']
        ];
        $_SESSION['ultimo_acesso'] = time();
        $_SESSION['empresas_usuario'] = $empresas;

        // Visão padrão do dashboard
        $mapVisao = ['detalhado'=>'variavel','consolidado'=>'modelo','percentual'=>'percentual','planilha'=>'planilha'];
        $vp = $mapVisao[$user['visao_padrao'] ?? ''] ?? 'variavel';
        $_SESSION['visao_padrao'] = $vp;
        $_SESSION['dashboard_visao'] = $vp;
        unset($_SESSION['dashboard_visao_explicit']);

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

        // Registrar login bem-sucedido
        if (class_exists('AuditoriaLog')) {
            $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']]);
                
                if (class_exists('AuditoriaLog')) {
                    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;
            }
            
            if (class_exists('AuditoriaLog')) {
                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 {
            if (class_exists('AuditoriaLog')) {
                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');
    
    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_regenerate_id(true);
        $_SESSION['usuario'] = [
            'id' => $_SESSION['usuario_temp']['cdpessoa'],
            'nome' => $_SESSION['usuario_temp']['dspessoa'],
            'login' => $_SESSION['usuario_temp']['dsusuario']
        ];
        $_SESSION['ultimo_acesso'] = time();

        // Visão padrão do dashboard (após troca de senha)
        $mapVisaoTs = ['detalhado'=>'variavel','consolidado'=>'modelo','percentual'=>'percentual','planilha'=>'planilha'];
        $vpTs = $mapVisaoTs[$_SESSION['usuario_temp']['visao_padrao'] ?? ''] ?? 'variavel';
        $_SESSION['visao_padrao'] = $vpTs;
        $_SESSION['dashboard_visao'] = $vpTs;
        unset($_SESSION['dashboard_visao_explicit']);

        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;
        
        if (class_exists('AuditoriaLog')) {
            $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) {
        if (class_exists('AuditoriaLog')) {
            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'];
    $_SESSION['empresa_nome'] = $empresa['nome'] ?? '';
    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');

    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);
    white-space: nowrap;
    font-size: clamp(0.95rem, 3.5vw, 1.15rem);
}

.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: clamp(0.88rem, 3.2vw, 1.1rem);
    }

    .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;
}

.frase-motivacional {
    padding: 0.75rem 0.5rem 0;
    min-height: 52px;
    display: flex;
    align-items: center;
    justify-content: center;
}
.frase-motivacional p {
    font-size: 0.9rem;
    color: var(--text-secondary);
    font-style: italic;
    line-height: 1.4;
    animation: fadeInFrase 1s ease-out;
    transition: opacity 0.5s;
}
.frase-motivacional .autor {
    font-style: normal;
    font-weight: 600;
    color: var(--primary);
    font-size: 0.85rem;
}
@keyframes fadeInFrase {
    from { opacity: 0; transform: translateY(4px); }
    to { opacity: 1; transform: translateY(0); }
}
</style>
</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>Helm, Defina a Direção. Alcance o Destino!</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>

    <div class="frase-motivacional text-center mt-3">
        <p id="fraseMotivacional" class="mb-0"></p>
    </div>

    <footer>&copy; <?= 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>&copy; <?= 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);
            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);
        });

        // 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()) {
        alertSenhaNova.style.display = 'block';
    }
});

// Frases motivacionais de negócios
(function() {
    const frases = [
        { texto: '"O sucesso nos negócios requer treino, disciplina e trabalho duro."', autor: 'David Rockefeller' },
        { texto: '"Sua marca é o que as pessoas dizem sobre você quando você não está na sala."', autor: 'Jeff Bezos' },
        { texto: '"O maior risco é não correr risco algum."', autor: 'Mark Zuckerberg' },
        { texto: '"Não encontre clientes para seus produtos. Encontre produtos para seus clientes."', autor: 'Seth Godin' },
        { texto: '"A inovação distingue um líder de um seguidor."', autor: 'Steve Jobs' },
        { texto: '"Gestão é fazer as coisas certas. Liderança é fazer a coisa certa."', autor: 'Peter Drucker' },
        { texto: '"Se você não consegue explicar de forma simples, é porque não entendeu bem."', autor: 'Albert Einstein' },
        { texto: '"Planeje o trabalho e trabalhe o plano."', autor: 'Napoleon Hill' },
        { texto: '"O segredo do sucesso é a constância do propósito."', autor: 'Benjamin Disraeli' },
        { texto: '"Onde há uma empresa de sucesso, alguém tomou uma decisão corajosa."', autor: 'Peter Drucker' },
        { texto: '"Quem controla o orçamento, controla o destino da empresa."', autor: 'Warren Buffett' },
        { texto: '"A excelência não é um ato, mas um hábito."', autor: 'Aristóteles' },
        { texto: '"Resultados acontecem quando a preparação encontra a oportunidade."', autor: 'Seneca' },
        { texto: '"O tempo é o recurso mais escasso. Se não for gerenciado, nada mais pode ser."', autor: 'Peter Drucker' },
        { texto: '"Foco é dizer não para centenas de boas ideias."', autor: 'Steve Jobs' },
        { texto: '"A melhor maneira de prever o futuro é criá-lo."', autor: 'Peter Drucker' },
        { texto: '"Cuide dos seus custos e os lucros cuidarão de si mesmos."', autor: 'Andrew Carnegie' },
        { texto: '"Grandes empresas são construídas sobre grandes produtos."', autor: 'Elon Musk' },
        { texto: '"A única maneira de fazer um excelente trabalho é amar o que você faz."', autor: 'Steve Jobs' },
        { texto: '"Sem dados você é apenas mais uma pessoa com opinião."', autor: 'W. Edwards Deming' }
    ];
    const el = document.getElementById('fraseMotivacional');
    if (el) {
        const f = frases[Math.floor(Math.random() * frases.length)];
        el.innerHTML = f.texto + '<br><span class="autor">— ' + f.autor + '</span>';
    }
})();

// 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()) {
        alertSenhaConf.style.display = 'block';
    }
});
</script>
</body>
</html>


