<?php
/**
 * API DE LOGIN DE GESTORES - ESPECÍFICA PARA APP ANDROID
 * Otimizada para resolver o erro "null" no app móvel
 */

// Headers CORS robustos para app Android
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization, Accept, User-Agent');
header('Access-Control-Max-Age: 3600');

// Log detalhado para debug
$logFile = __DIR__ . '/../../logs/login-gestor-app.log';
$logDir = dirname($logFile);
if (!is_dir($logDir)) {
    mkdir($logDir, 0755, true);
}

function logDebug($message) {
    global $logFile;
    $timestamp = date('Y-m-d H:i:s');
    $ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
    $userAgent = $_SERVER['HTTP_USER_AGENT'] ?? 'unknown';
    file_put_contents($logFile, "[$timestamp] [$ip] $message\n", FILE_APPEND);
}

logDebug("========== INICIO LOGIN GESTOR APP ==========");
logDebug("Método: " . $_SERVER['REQUEST_METHOD']);
logDebug("User-Agent: " . ($_SERVER['HTTP_USER_AGENT'] ?? 'N/A'));

// Tratar OPTIONS (preflight CORS)
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    logDebug("Requisição OPTIONS - CORS preflight");
    http_response_code(200);
    exit(0);
}

// Função para resposta padronizada
function enviarResposta($sucesso, $dados = null, $erro = null, $codigo = 200) {
    http_response_code($codigo);
    $response = [
        'sucesso' => $sucesso,
        'timestamp' => date('c')
    ];
    
    if ($sucesso) {
        $response = array_merge($response, $dados);
    } else {
        $response['erro'] = $erro;
    }
    
    logDebug("Resposta enviada: " . json_encode($response));
    echo json_encode($response, JSON_UNESCAPED_UNICODE);
    exit();
}

// Aceitar tanto POST quanto GET para máxima compatibilidade
$metodoPermitido = in_array($_SERVER['REQUEST_METHOD'], ['POST', 'GET']);
if (!$metodoPermitido) {
    logDebug("Método não permitido: " . $_SERVER['REQUEST_METHOD']);
    enviarResposta(false, null, 'Método não permitido', 405);
}

try {
    // Obter credenciais de múltiplas fontes
    $usuario = '';
    $senha = '';
    
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        // Tentar JSON primeiro
        $input = json_decode(file_get_contents('php://input'), true);
        if ($input) {
            $usuario = $input['usuario'] ?? '';
            $senha = $input['senha'] ?? '';
            logDebug("Credenciais obtidas via JSON POST");
        } else {
            // Tentar form data
            $usuario = $_POST['usuario'] ?? '';
            $senha = $_POST['senha'] ?? '';
            logDebug("Credenciais obtidas via form POST");
        }
    } else {
        // GET (para teste)
        $usuario = $_GET['usuario'] ?? '';
        $senha = $_GET['senha'] ?? '';
        logDebug("Credenciais obtidas via GET");
    }
    
    logDebug("Usuário informado: '$usuario'");
    logDebug("Senha informada: " . ($senha ? 'presente (' . strlen($senha) . ' chars)' : 'vazia'));
    
    if (empty($usuario) || empty($senha)) {
        logDebug("Credenciais vazias");
        enviarResposta(false, null, 'Usuário e senha são obrigatórios', 400);
    }
    
    // Conectar ao banco
    require_once __DIR__ . '/../../config/database.php';
    $pdo = conectarBanco();
    logDebug("Conexão com banco estabelecida");
    
    // Verificar se tabela existe e criar se necessário
    try {
        $stmt = $pdo->query("SHOW TABLES LIKE 'gestores'");
        $tabelaExiste = $stmt->rowCount() > 0;
        
        if (!$tabelaExiste) {
            logDebug("Tabela 'gestores' não existe - criando automaticamente");
            
            $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);
            logDebug("Tabela 'gestores' criada");
            
            // Inserir 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'
            ]);
            logDebug("Admin padrão criado");
        }
    } catch (Exception $e) {
        logDebug("Erro ao verificar/criar tabela: " . $e->getMessage());
        enviarResposta(false, null, 'Erro de configuração do banco', 500);
    }
    
    // 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) {
        logDebug("Gestor não encontrado: '$usuario'");
        
        // Listar gestores disponíveis para debug
        $stmt = $pdo->query("SELECT usuario, status FROM gestores LIMIT 5");
        $gestoresDisponiveis = $stmt->fetchAll();
        logDebug("Gestores disponíveis: " . json_encode($gestoresDisponiveis));
        
        enviarResposta(false, null, 'Credenciais inválidas - usuário não encontrado', 401);
    }
    
    logDebug("Gestor encontrado: {$gestor['nome']} (ID: {$gestor['id']})");
    
    // Verificar senha
    $senhaCorreta = password_verify($senha, $gestor['senha']);
    logDebug("Verificação de senha: " . ($senhaCorreta ? 'OK' : 'FALHOU'));
    
    if (!$senhaCorreta) {
        // Fallback: verificar senha em texto plano (compatibilidade)
        if ($gestor['senha'] === $senha) {
            logDebug("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) {
        logDebug("Senha incorreta para gestor: {$gestor['nome']}");
        enviarResposta(false, null, 'Credenciais inválidas - senha incorreta', 401);
    }
    
    // Atualizar último acesso
    $updateSql = "UPDATE gestores SET data_ultimo_acesso = NOW() WHERE id = ?";
    $updateStmt = $pdo->prepare($updateSql);
    $updateStmt->execute([$gestor['id']]);
    
    // Remover senha do retorno
    unset($gestor['senha']);
    
    // Gerar token JWT simples
    $token = base64_encode(json_encode([
        'id' => $gestor['id'],
        'usuario' => $gestor['usuario'],
        'nivel' => $gestor['nivel_acesso'],
        'exp' => time() + (24 * 60 * 60)
    ]));
    
    logDebug("Login bem-sucedido para: {$gestor['nome']}");
    
    // Resposta de sucesso otimizada para o app
    enviarResposta(true, [
        'gestor' => $gestor,
        'token' => $token,
        'mensagem' => 'Login realizado com sucesso'
    ]);
    
} catch (PDOException $e) {
    logDebug("Erro de banco: " . $e->getMessage());
    enviarResposta(false, null, 'Erro interno do servidor - banco', 500);
    
} catch (Exception $e) {
    logDebug("Erro geral: " . $e->getMessage());
    enviarResposta(false, null, 'Erro interno do servidor', 500);
    
} finally {
    logDebug("========== FIM LOGIN GESTOR APP ==========");
}
?> 
