<?php

require_once __DIR__ . '/../../vendor/autoload.php';
require_once __DIR__ . '/../../config/bootstrap.php';

use ControleFrotas\Config\Database;
use ControleFrotas\Utils\JWT;
use ControleFrotas\Utils\Response;
use ControleFrotas\Utils\Logger;

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

// Handle preflight OPTIONS request
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit();
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    Response::error('Método não permitido', 405);
}

try {
    // Receber dados JSON
    $input = json_decode(file_get_contents('php://input'), true);
    
    if (!$input || !isset($input['email']) || !isset($input['senha'])) {
        Response::error('Email e senha são obrigatórios', 400);
    }

    $email = trim($input['email']);
    $senha = trim($input['senha']);

    // Validações básicas
    if (empty($email) || empty($senha)) {
        Response::error('Email e senha não podem estar vazios', 400);
    }

    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        Response::error('Email inválido', 400);
    }

    // Buscar usuário no banco
    $sql = "SELECT id, nome, email, senha, cargo, ativo, ultimo_login 
            FROM usuarios 
            WHERE email = ? AND ativo = 1";
    
    $user = Database::queryOne($sql, [$email]);

    if (!$user) {
        Logger::warning('Tentativa de login com email não encontrado', [
            'email' => $email,
            'ip' => $_SERVER['REMOTE_ADDR'] ?? 'unknown'
        ]);
        Response::error('Credenciais inválidas', 401);
    }

    // Verificar senha
    if (!password_verify($senha, $user['senha'])) {
        Logger::warning('Tentativa de login com senha incorreta', [
            'user_id' => $user['id'],
            'email' => $email,
            'ip' => $_SERVER['REMOTE_ADDR'] ?? 'unknown'
        ]);
        Response::error('Credenciais inválidas', 401);
    }

    // Atualizar último login
    Database::execute(
        "UPDATE usuarios SET ultimo_login = NOW() WHERE id = ?",
        [$user['id']]
    );

    // Gerar tokens JWT
    $tokenPayload = [
        'user_id' => $user['id'],
        'email' => $user['email'],
        'nome' => $user['nome'],
        'cargo' => $user['cargo']
    ];

    $accessToken = JWT::generate($tokenPayload);
    $refreshToken = JWT::generateRefreshToken($user['id']);

    // Salvar sessão no banco
    $sessionId = bin2hex(random_bytes(32));
    $tokenHash = hash('sha256', $accessToken);
    
    Database::execute(
        "INSERT INTO jwt_sessions (id, user_id, token_hash, expires_at, ip_address, user_agent) 
         VALUES (?, ?, ?, DATE_ADD(NOW(), INTERVAL 1 HOUR), ?, ?)",
        [
            $sessionId,
            $user['id'],
            $tokenHash,
            $_SERVER['REMOTE_ADDR'] ?? null,
            $_SERVER['HTTP_USER_AGENT'] ?? null
        ]
    );

    Logger::info('Login realizado com sucesso', [
        'user_id' => $user['id'],
        'email' => $user['email'],
        'session_id' => $sessionId
    ]);

    // Resposta de sucesso
    Response::success([
        'message' => 'Login realizado com sucesso',
        'user' => [
            'id' => $user['id'],
            'nome' => $user['nome'],
            'email' => $user['email'],
            'cargo' => $user['cargo']
        ],
        'tokens' => [
            'access_token' => $accessToken,
            'refresh_token' => $refreshToken,
            'expires_in' => 3600
        ],
        'session_id' => $sessionId
    ]);

} catch (PDOException $e) {
    Logger::error('Erro de banco de dados no login', [
        'error' => $e->getMessage(),
        'trace' => $e->getTraceAsString()
    ]);
    Response::error('Erro interno do servidor', 500);
} catch (Exception $e) {
    Logger::error('Erro no login', [
        'error' => $e->getMessage(),
        'trace' => $e->getTraceAsString()
    ]);
    Response::error('Erro interno do servidor', 500);
} 
