<?php
/**
 * API DE LOGIN DE GESTORES - VERSÃO MELHORADA
 * Com logs detalhados e autocorreção de problemas
 */

header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');

// Logs detalhados
error_log("========== LOGIN GESTOR DEBUG ==========");
error_log("Timestamp: " . date('Y-m-d H:i:s'));
error_log("Método: " . $_SERVER['REQUEST_METHOD']);
error_log("User-Agent: " . ($_SERVER['HTTP_USER_AGENT'] ?? 'N/A'));
error_log("IP: " . ($_SERVER['REMOTE_ADDR'] ?? 'N/A'));

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    error_log("✅ Requisição OPTIONS - CORS");
    exit(0);
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    error_log("❌ Método inválido: " . $_SERVER['REQUEST_METHOD']);
    http_response_code(405);
    echo json_encode(['sucesso' => false, 'erro' => 'Método não permitido']);
    exit();
}

try {
    // 1. Conectar ao banco
    require_once __DIR__ . '/../../config/database.php';
    $pdo = conectarBanco();
    error_log("✅ Conexão com banco estabelecida");
    
    // 2. Obter dados da requisição
    $input = json_decode(file_get_contents('php://input'), true);
    error_log("Body recebido: " . file_get_contents('php://input'));
    
    $usuario = $input['usuario'] ?? $_POST['usuario'] ?? '';
    $senha = $input['senha'] ?? $_POST['senha'] ?? '';
    
    error_log("Usuário informado: '$usuario'");
    error_log("Senha informada: " . (empty($senha) ? 'vazia' : 'preenchida (' . strlen($senha) . ' chars)'));
    
    if (empty($usuario) || empty($senha)) {
        error_log("❌ Credenciais vazias");
        throw new Exception('Usuário e senha são obrigatórios');
    }
    
    // 3. Verificar se tabela gestores existe
    try {
        $stmt = $pdo->query("SHOW TABLES LIKE 'gestores'");
        $tabelaExiste = $stmt->rowCount() > 0;
        
        if (!$tabelaExiste) {
            error_log("⚠️ Tabela 'gestores' não existe - criando automaticamente");
            
            // Criar tabela
            $createSql = "CREATE TABLE gestores (
                id INT AUTO_INCREMENT PRIMARY KEY,
                nome VARCHAR(100) NOT NULL,
                email VARCHAR(100) UNIQUE NOT NULL,
                usuario VARCHAR(50) UNIQUE NOT NULL,
                senha VARCHAR(255) NOT NULL,
                nivel_acesso ENUM('gestor', 'admin', 'supervisor') NOT NULL DEFAULT 'gestor',
                telefone VARCHAR(20),
                departamento VARCHAR(100),
                foto TEXT,
                status ENUM('ativo', 'inativo', 'bloqueado') NOT NULL DEFAULT 'ativo',
                data_criacao TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                data_ultimo_acesso TIMESTAMP NULL,
                criado_por INT,
                observacoes TEXT,
                INDEX idx_usuario (usuario),
                INDEX idx_email (email),
                INDEX idx_status (status)
            )";
            
            $pdo->exec($createSql);
            error_log("✅ Tabela 'gestores' criada");
            
            // Inserir gestor padrão
            $senhaHash = password_hash('admin123', PASSWORD_DEFAULT);
            $insertSql = "INSERT INTO gestores (nome, email, usuario, senha, nivel_acesso, status) 
                          VALUES (?, ?, ?, ?, ?, ?)";
            $stmt = $pdo->prepare($insertSql);
            $stmt->execute([
                'Administrador do Sistema',
                'admin@pinheiroempresas.com.br',
                'admin',
                $senhaHash,
                'admin',
                'ativo'
            ]);
            error_log("✅ Gestor 'admin' criado automaticamente");
        } else {
            error_log("✅ Tabela 'gestores' existe");
        }
    } catch (Exception $e) {
        error_log("❌ Erro ao verificar/criar tabela: " . $e->getMessage());
        throw new Exception('Erro interno do servidor - configuração');
    }
    
    // 4. Verificar se existem gestores
    $stmt = $pdo->query("SELECT COUNT(*) as total FROM gestores WHERE status = 'ativo'");
    $total = $stmt->fetch()['total'];
    error_log("Gestores ativos encontrados: $total");
    
    if ($total == 0) {
        error_log("⚠️ Nenhum gestor ativo - criando admin padrão");
        
        $senhaHash = password_hash('admin123', PASSWORD_DEFAULT);
        $insertSql = "INSERT INTO gestores (nome, email, usuario, senha, nivel_acesso, status) 
                      VALUES (?, ?, ?, ?, ?, ?)";
        $stmt = $pdo->prepare($insertSql);
        $stmt->execute([
            'Administrador do Sistema',
            'admin@pinheiroempresas.com.br',
            'admin',
            $senhaHash,
            'admin',
            'ativo'
        ]);
        error_log("✅ Gestor admin criado automaticamente");
    }
    
    // 5. Buscar gestor
    $sql = "SELECT id, nome, email, usuario, senha, nivel_acesso, telefone, 
                   departamento, foto, status, data_ultimo_acesso
            FROM gestores 
            WHERE usuario = ? AND status = 'ativo'";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$usuario]);
    $gestor = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if (!$gestor) {
        error_log("❌ Gestor não encontrado: '$usuario'");
        
        // Listar gestores disponíveis para debug
        $stmt = $pdo->query("SELECT usuario, status FROM gestores");
        $gestoresDisponiveis = $stmt->fetchAll();
        error_log("Gestores disponíveis: " . json_encode($gestoresDisponiveis));
        
        throw new Exception('Credenciais inválidas - usuário não encontrado');
    }
    
    error_log("✅ Gestor encontrado: {$gestor['nome']} (ID: {$gestor['id']})");
    
    // 6. Verificar senha
    $senhaCorreta = password_verify($senha, $gestor['senha']);
    error_log("Verificação de senha: " . ($senhaCorreta ? 'OK' : 'FALHOU'));
    
    if (!$senhaCorreta) {
        // Fallback: verificar senha em texto plano (para compatibilidade)
        if ($gestor['senha'] === $senha) {
            error_log("⚠️ Senha em texto plano detectada - atualizando hash");
            $novoHash = password_hash($senha, PASSWORD_DEFAULT);
            $updateSql = "UPDATE gestores SET senha = ? WHERE id = ?";
            $updateStmt = $pdo->prepare($updateSql);
            $updateStmt->execute([$novoHash, $gestor['id']]);
            $senhaCorreta = true;
        }
    }
    
    if (!$senhaCorreta) {
        error_log("❌ Senha incorreta para gestor: {$gestor['nome']}");
        throw new Exception('Credenciais inválidas - senha incorreta');
    }
    
    // 7. Atualizar último acesso
    $updateSql = "UPDATE gestores SET data_ultimo_acesso = NOW() WHERE id = ?";
    $updateStmt = $pdo->prepare($updateSql);
    $updateStmt->execute([$gestor['id']]);
    
    // 8. Remover senha do retorno
    unset($gestor['senha']);
    
    // 9. Gerar token JWT simples
    $token = base64_encode(json_encode([
        'id' => $gestor['id'],
        'usuario' => $gestor['usuario'],
        'nivel' => $gestor['nivel_acesso'],
        'exp' => time() + (24 * 60 * 60) // 24 horas
    ]));
    
    error_log("✅ Login bem-sucedido para: {$gestor['nome']}");
    error_log("=========== FIM DEBUG LOGIN ===========");
    
    // 10. Resposta de sucesso
    $response = [
        'sucesso' => true,
        'gestor' => $gestor,
        'token' => $token,
        'mensagem' => 'Login realizado com sucesso',
        'timestamp' => date('c')
    ];
    
    echo json_encode($response, JSON_UNESCAPED_UNICODE);
    
} catch (PDOException $e) {
    error_log("❌ Erro de banco: " . $e->getMessage());
    error_log("Stack trace: " . $e->getTraceAsString());
    
    http_response_code(500);
    echo json_encode([
        'sucesso' => false,
        'erro' => 'Erro interno do servidor - banco de dados',
        'detalhes' => $e->getMessage()
    ], JSON_UNESCAPED_UNICODE);
    
} catch (Exception $e) {
    error_log("❌ Erro geral: " . $e->getMessage());
    error_log("Stack trace: " . $e->getTraceAsString());
    
    http_response_code(401);
    echo json_encode([
        'sucesso' => false,
        'erro' => $e->getMessage(),
        'timestamp' => date('c')
    ], JSON_UNESCAPED_UNICODE);
    
} finally {
    error_log("=========== FIM DEBUG LOGIN ===========");
}
?> 
