<?php

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

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

header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');

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

// Verificar autenticação
$user = requireAuth();

// Ativar exibição de erros detalhados para depuração
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

switch ($_SERVER['REQUEST_METHOD']) {
    case 'POST':
        $acao = $_GET['acao'] ?? 'criar';
        switch ($acao) {
            case 'criar':
                criarSolicitacao();
                break;
            case 'aprovar':
                aprovarSolicitacao();
                break;
            case 'negar':
                negarSolicitacao();
                break;
            default:
                Response::error('Ação não reconhecida', 400);
        }
        break;
    
    case 'GET':
        $acao = $_GET['acao'] ?? 'listar';
        switch ($acao) {
            case 'listar':
                listarSolicitacoes();
                break;
            case 'pendentes':
                listarSolicitacoesPendentes();
                break;
            case 'detalhes':
                obterDetalhesSolicitacao();
                break;
            default:
                Response::error('Ação não reconhecida', 400);
        }
        break;
    
    default:
        Response::error('Método não permitido', 405);
}

/**
 * Criar nova solicitação de viagem
 */
function criarSolicitacao(): void {
    global $user;
    
    $input = json_decode(file_get_contents('php://input'), true);
    
    if (!$input) {
        Response::error('Dados da solicitação são obrigatórios', 400);
    }

    // Validar campos obrigatórios
    $camposObrigatorios = ['veiculo_id', 'cliente', 'motivo', 'km_inicial'];
    foreach ($camposObrigatorios as $campo) {
        if (!isset($input[$campo]) || empty($input[$campo])) {
            Response::error("Campo obrigatório: $campo", 400);
        }
    }

    try {
        Database::beginTransaction();

        // Inserir solicitação
        file_put_contents(__DIR__ . '/solicitacao_debug.txt', "ANTES DO INSERT\n" . print_r($input, true), FILE_APPEND);
        $sql = "INSERT INTO solicitacoes_viagem (
            tecnico_id, veiculo_id, cliente, motivo, km_inicial,
            latitude_inicial, longitude_inicial, endereco_inicial, cliente_id,
            observacoes, prioridade, gestor_id
        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

        $stmt = Database::execute($sql, [
            $user['user_id'],
            $input['veiculo_id'],
            $input['cliente'],
            $input['motivo'],
            $input['km_inicial'],
            $input['latitude_inicial'] ?? null,
            $input['longitude_inicial'] ?? null,
            $input['endereco_inicial'] ?? null,
            $input['cliente_id'] ?? null,
            $input['observacoes'] ?? null,
            $input['prioridade'] ?? 'normal',
            $input['gestor_id'] ?? null
        ]);
        file_put_contents(__DIR__ . '/solicitacao_debug.txt', "DEPOIS DO INSERT\n", FILE_APPEND);

        $solicitacaoId = Database::lastInsertId();

        // Enviar notificação para gestores (comentado para isolar erro)
        // enviarNotificacaoParaGestores($solicitacaoId, 'solicitacao_viagem', [
        //     'tecnico_nome' => $user['nome'] ?? $user['user_id'],
        //     'cliente' => $input['cliente'],
        //     'motivo' => $input['motivo'],
        //     'prioridade' => $input['prioridade'] ?? 'normal'
        // ]);
        file_put_contents(__DIR__ . '/solicitacao_debug.txt', "DEPOIS DA NOTIFICACAO\n", FILE_APPEND);

        Database::commit();
        file_put_contents(__DIR__ . '/solicitacao_debug.txt', "DEPOIS DO COMMIT\n", FILE_APPEND);

        Logger::info('Solicitação de viagem criada', [
            'solicitacao_id' => $solicitacaoId,
            'tecnico_id' => $user['user_id'],
            'cliente' => $input['cliente']
        ]);
        file_put_contents(__DIR__ . '/solicitacao_debug.txt', "DEPOIS DO LOGGER\n", FILE_APPEND);

        Response::success([
            'solicitacao_id' => $solicitacaoId,
            'status' => 'pendente',
            'mensagem' => 'Solicitação enviada para aprovação do gestor'
        ]);
        file_put_contents(__DIR__ . '/solicitacao_debug.txt', "DEPOIS DO RESPONSE\n", FILE_APPEND);

    } catch (Exception $e) {
        Database::rollback();
        Logger::error('Erro ao criar solicitação de viagem', [
            'error' => $e->getMessage(),
            'user_id' => $user['user_id']
        ]);
        file_put_contents(__DIR__ . '/solicitacao_debug.txt', "ERRO: " . $e->getMessage() . "\n", FILE_APPEND);
        Response::error('Erro ao criar solicitação: ' . $e->getMessage(), 500);
    }
}

/**
 * Aprovar solicitação de viagem
 */
function aprovarSolicitacao(): void {
    global $user;
    
    $input = json_decode(file_get_contents('php://input'), true);
    $solicitacaoId = $input['solicitacao_id'] ?? null;
    
    if (!$solicitacaoId) {
        Response::error('ID da solicitação é obrigatório', 400);
    }

    try {
        Database::beginTransaction();

        // Buscar solicitação
        $solicitacao = Database::queryOne(
            "SELECT * FROM solicitacoes_viagem WHERE id = ? AND status = 'pendente'",
            [$solicitacaoId]
        );

        if (!$solicitacao) {
            Response::error('Solicitação não encontrada ou já processada', 404);
        }

        // Atualizar status da solicitação
        Database::execute(
            "UPDATE solicitacoes_viagem SET 
             status = 'aprovada', 
             gestor_id = ?, 
             data_resposta = NOW(), 
             justificativa_gestor = ? 
             WHERE id = ?",
            [$user['user_id'], $input['justificativa'] ?? 'Aprovada pelo gestor', $solicitacaoId]
        );

        // Criar viagem automaticamente
        $viagemId = criarViagemApoAprovacao($solicitacao);

        // Atualizar solicitação com ID da viagem
        Database::execute(
            "UPDATE solicitacoes_viagem SET viagem_id = ? WHERE id = ?",
            [$viagemId, $solicitacaoId]
        );

        // Enviar notificação de aprovação para o técnico
        enviarNotificacaoParaUsuario($solicitacao['tecnico_id'], 'aprovacao_viagem', [
            'gestor_nome' => $user['nome'] ?? $user['user_id'],
            'cliente' => $solicitacao['cliente'],
            'viagem_id' => $viagemId
        ]);

        Database::commit();

        Logger::info('Solicitação de viagem aprovada', [
            'solicitacao_id' => $solicitacaoId,
            'gestor_id' => $user['user_id'],
            'viagem_id' => $viagemId
        ]);

        Response::success([
            'solicitacao_id' => $solicitacaoId,
            'viagem_id' => $viagemId,
            'status' => 'aprovada',
            'mensagem' => 'Viagem aprovada e criada com sucesso'
        ]);

    } catch (Exception $e) {
        Database::rollback();
        Logger::error('Erro ao aprovar solicitação', [
            'error' => $e->getMessage(),
            'solicitacao_id' => $solicitacaoId,
            'gestor_id' => $user['user_id']
        ]);
        Response::error('Erro ao aprovar solicitação: ' . $e->getMessage(), 500);
    }
}

/**
 * Negar solicitação de viagem
 */
function negarSolicitacao(): void {
    global $user;
    
    $input = json_decode(file_get_contents('php://input'), true);
    $solicitacaoId = $input['solicitacao_id'] ?? null;
    $justificativa = $input['justificativa'] ?? null;
    
    if (!$solicitacaoId) {
        Response::error('ID da solicitação é obrigatório', 400);
    }

    if (!$justificativa) {
        Response::error('Justificativa é obrigatória para negar solicitação', 400);
    }

    try {
        Database::beginTransaction();

        // Buscar solicitação
        $solicitacao = Database::queryOne(
            "SELECT * FROM solicitacoes_viagem WHERE id = ? AND status = 'pendente'",
            [$solicitacaoId]
        );

        if (!$solicitacao) {
            Response::error('Solicitação não encontrada ou já processada', 404);
        }

        // Atualizar status da solicitação
        Database::execute(
            "UPDATE solicitacoes_viagem SET 
             status = 'negada', 
             gestor_id = ?, 
             data_resposta = NOW(), 
             justificativa_gestor = ? 
             WHERE id = ?",
            [$user['user_id'], $justificativa, $solicitacaoId]
        );

        // Enviar notificação de negação para o técnico
        enviarNotificacaoParaUsuario($solicitacao['tecnico_id'], 'negacao_viagem', [
            'gestor_nome' => $user['nome'] ?? $user['user_id'],
            'cliente' => $solicitacao['cliente'],
            'justificativa' => $justificativa
        ]);

        Database::commit();

        Logger::info('Solicitação de viagem negada', [
            'solicitacao_id' => $solicitacaoId,
            'gestor_id' => $user['user_id'],
            'justificativa' => $justificativa
        ]);

        Response::success([
            'solicitacao_id' => $solicitacaoId,
            'status' => 'negada',
            'justificativa' => $justificativa,
            'mensagem' => 'Solicitação negada com sucesso'
        ]);

    } catch (Exception $e) {
        Database::rollback();
        Logger::error('Erro ao negar solicitação', [
            'error' => $e->getMessage(),
            'solicitacao_id' => $solicitacaoId,
            'gestor_id' => $user['user_id']
        ]);
        Response::error('Erro ao negar solicitação: ' . $e->getMessage(), 500);
    }
}

/**
 * Listar todas as solicitações (com filtros)
 */
function listarSolicitacoes(): void {
    global $user;
    
    $status = $_GET['status'] ?? null;
    $tecnicoId = $_GET['tecnico_id'] ?? null;
    $limite = (int)($_GET['limite'] ?? 50);
    $offset = (int)($_GET['offset'] ?? 0);

    $whereConditions = [];
    $params = [];

    if ($status) {
        $whereConditions[] = "s.status = ?";
        $params[] = $status;
    }

    if ($tecnicoId) {
        $whereConditions[] = "s.tecnico_id = ?";
        $params[] = $tecnicoId;
    }

    $whereClause = empty($whereConditions) ? "" : "WHERE " . implode(" AND ", $whereConditions);

    $sql = "SELECT 
                s.*,
                u.nome as tecnico_nome,
                v.modelo as veiculo_modelo,
                v.placa as veiculo_placa,
                g.nome as gestor_nome
            FROM solicitacoes_viagem s
            LEFT JOIN usuarios u ON s.tecnico_id = u.id
            LEFT JOIN veiculos v ON s.veiculo_id = v.id
            LEFT JOIN usuarios g ON s.gestor_id = g.id
            $whereClause
            ORDER BY s.data_solicitacao DESC
            LIMIT ? OFFSET ?";

    $params[] = $limite;
    $params[] = $offset;

    try {
        $solicitacoes = Database::query($sql, $params);

        Response::success([
            'solicitacoes' => $solicitacoes,
            'total' => count($solicitacoes),
            'limite' => $limite,
            'offset' => $offset
        ]);

    } catch (Exception $e) {
        Logger::error('Erro ao listar solicitações', [
            'error' => $e->getMessage(),
            'user_id' => $user['user_id']
        ]);
        Response::error('Erro ao listar solicitações: ' . $e->getMessage(), 500);
    }
}

/**
 * Listar apenas solicitações pendentes para gestor
 */
function listarSolicitacoesPendentes(): void {
    global $user;
    
    try {
        $sql = "SELECT 
                    s.*,
                    u.nome as tecnico_nome,
                    v.modelo as veiculo_modelo,
                    v.placa as veiculo_placa,
                    TIMESTAMPDIFF(MINUTE, s.data_solicitacao, NOW()) as tempo_espera_minutos
                FROM solicitacoes_viagem s
                LEFT JOIN usuarios u ON s.tecnico_id = u.id
                LEFT JOIN veiculos v ON s.veiculo_id = v.id
                WHERE s.status = 'pendente'
                ORDER BY s.prioridade DESC, s.data_solicitacao ASC";

        $pendentes = Database::query($sql);

        Response::success([
            'solicitacoes_pendentes' => $pendentes,
            'total_pendentes' => count($pendentes)
        ]);

    } catch (Exception $e) {
        Logger::error('Erro ao listar solicitações pendentes', [
            'error' => $e->getMessage(),
            'user_id' => $user['user_id']
        ]);
        Response::error('Erro ao listar solicitações pendentes: ' . $e->getMessage(), 500);
    }
}

/**
 * Obter detalhes de uma solicitação específica
 */
function obterDetalhesSolicitacao(): void {
    $solicitacaoId = $_GET['id'] ?? null;
    
    if (!$solicitacaoId) {
        Response::error('ID da solicitação é obrigatório', 400);
    }

    try {
        $sql = "SELECT 
                    s.*,
                    u.nome as tecnico_nome,
                    u.email as tecnico_email,
                    v.modelo as veiculo_modelo,
                    v.placa as veiculo_placa,
                    g.nome as gestor_nome
                FROM solicitacoes_viagem s
                LEFT JOIN usuarios u ON s.tecnico_id = u.id
                LEFT JOIN veiculos v ON s.veiculo_id = v.id
                LEFT JOIN usuarios g ON s.gestor_id = g.id
                WHERE s.id = ?";

        $solicitacao = Database::queryOne($sql, [$solicitacaoId]);

        if (!$solicitacao) {
            Response::error('Solicitação não encontrada', 404);
        }

        Response::success($solicitacao);

    } catch (Exception $e) {
        Logger::error('Erro ao obter detalhes da solicitação', [
            'error' => $e->getMessage(),
            'solicitacao_id' => $solicitacaoId
        ]);
        Response::error('Erro ao obter detalhes: ' . $e->getMessage(), 500);
    }
}

/**
 * Criar viagem após aprovação da solicitação
 */
function criarViagemApoAprovacao(array $solicitacao): int {
    $sql = "INSERT INTO viagens (
        tecnico_id, veiculo_id, cliente, motivo, km_inicial,
        data_inicio, latitude_inicial, longitude_inicial,
        endereco_inicial, cliente_id, observacoes, sincronizado
    ) VALUES (?, ?, ?, ?, ?, NOW(), ?, ?, ?, ?, ?, 1)";

    Database::execute($sql, [
        $solicitacao['tecnico_id'],
        $solicitacao['veiculo_id'],
        $solicitacao['cliente'],
        $solicitacao['motivo'],
        $solicitacao['km_inicial'],
        $solicitacao['latitude_inicial'],
        $solicitacao['longitude_inicial'],
        $solicitacao['endereco_inicial'],
        $solicitacao['cliente_id'],
        'Viagem criada após aprovação da solicitação #' . $solicitacao['id']
    ]);

    return Database::lastInsertId();
}

/**
 * Enviar notificação para gestores
 */
function enviarNotificacaoParaGestores(int $solicitacaoId, string $tipo, array $dados): void {
    // Buscar todos os gestores com ntfy_topic definido
    $gestores = Database::query(
        "SELECT id, nome, ntfy_topic FROM gestores WHERE nivel_acesso = 'gestor' AND status = 'ativo' AND ntfy_topic IS NOT NULL AND ntfy_topic != ''"
    );

    foreach ($gestores as $gestor) {
        $titulo = '🚗 Nova Solicitação de Viagem';
        $mensagem = sprintf(
            '%s solicita viagem para %s - %s (Prioridade: %s)',
            $dados['tecnico_nome'],
            $dados['cliente'],
            $dados['motivo'],
            strtoupper($dados['prioridade'])
        );

        // Enviar notificação via ntfy para o tópico individual do gestor
        if (!empty($gestor['ntfy_topic'])) {
            $ntfyUrl = 'https://ntfy.sh/' . $gestor['ntfy_topic'];
            // Envio simples via POST
            $payload = [
                'title' => $titulo,
                'message' => $mensagem
            ];
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $ntfyUrl);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $mensagem);
            curl_setopt($ch, CURLOPT_HTTPHEADER, [
                'Title: ' . $titulo
            ]);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_TIMEOUT, 5);
            curl_exec($ch);
            curl_close($ch);
        }

        // Registrar no banco normalmente
        Database::execute(
            "INSERT INTO notificacoes_push 
             (user_id, tipo, titulo, mensagem, solicitacao_id) 
             VALUES (?, ?, ?, ?, ?)",
            [$gestor['id'], $tipo, $titulo, $mensagem, $solicitacaoId]
        );
    }
}

/**
 * Enviar notificação para usuário específico
 */
function enviarNotificacaoParaUsuario(string $userId, string $tipo, array $dados): void {
    $titulo = '';
    $mensagem = '';

    switch ($tipo) {
        case 'aprovacao_viagem':
            $titulo = '✅ Viagem Aprovada';
            $mensagem = sprintf(
                'Sua viagem para %s foi aprovada por %s. Você já pode iniciar!',
                $dados['cliente'],
                $dados['gestor_nome']
            );
            break;
        
        case 'negacao_viagem':
            $titulo = '❌ Viagem Negada';
            $mensagem = sprintf(
                'Sua viagem para %s foi negada por %s. Motivo: %s',
                $dados['cliente'],
                $dados['gestor_nome'],
                $dados['justificativa']
            );
            break;
    }

    if ($titulo && $mensagem) {
        Database::execute(
            "INSERT INTO notificacoes_push 
             (user_id, tipo, titulo, mensagem, viagem_id) 
             VALUES (?, ?, ?, ?, ?)",
            [$userId, $tipo, $titulo, $mensagem, $dados['viagem_id'] ?? null]
        );
    }
}

?> 
