<?php
/**
 * API para gerenciamento de rotas
 * CRUD completo para solicitações de rotas
 */

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

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

// Conectar ao banco
function conectarBanco() {
    $host = 'localhost';
    $dbname = 'pinheir3_controle_frotasV1.1';
    $username = 'pinheir3_admin';
    $password = '080880Gelboy';
    
    try {
        $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        ]);
        return $pdo;
    } catch (PDOException $e) {
        throw new Exception('Erro de conexão: ' . $e->getMessage());
    }
}

// Resposta padronizada
function resposta($sucesso, $dados = null, $mensagem = '', $codigo = 200) {
    http_response_code($codigo);
    echo json_encode([
        'sucesso' => $sucesso,
        'dados' => $dados,
        'mensagem' => $mensagem,
        'timestamp' => date('c')
    ], JSON_UNESCAPED_UNICODE);
    exit();
}

// Roteamento
$metodo = $_SERVER['REQUEST_METHOD'];
$acao = $_GET['acao'] ?? 'listar';

try {
    $pdo = conectarBanco();

    switch ($acao) {
        case 'listar':
            listarRotas($pdo, $metodo);
            break;
            
        case 'detalhes':
            detalhesRota($pdo, $metodo);
            break;
            
        case 'aprovar':
            aprovarRota($pdo, $metodo);
            break;
            
        case 'negar':
            negarRota($pdo, $metodo);
            break;
            
        case 'cancelar':
            cancelarRota($pdo, $metodo);
            break;
            
        case 'estatisticas':
            estatisticasRotas($pdo, $metodo);
            break;
            
        default:
            resposta(false, null, 'Ação não encontrada', 404);
    }

} catch (Exception $e) {
    error_log("Erro na API de rotas: " . $e->getMessage());
    resposta(false, null, 'Erro interno: ' . $e->getMessage(), 500);
}

/**
 * Listar rotas com filtros
 */
function listarRotas($pdo, $metodo) {
    if ($metodo !== 'GET') {
        resposta(false, null, 'Método não permitido', 405);
    }

    $status = $_GET['status'] ?? null;
    $tecnico_id = $_GET['tecnico_id'] ?? null;
    $data_inicio = $_GET['data_inicio'] ?? null;
    $data_fim = $_GET['data_fim'] ?? null;
    $limite = intval($_GET['limite'] ?? 50);
    $pagina = intval($_GET['pagina'] ?? 1);
    $offset = ($pagina - 1) * $limite;

    $where = [];
    $params = [];

    if ($status) {
        $where[] = "sr.status = ?";
        $params[] = $status;
    }

    if ($tecnico_id) {
        $where[] = "sr.tecnico_id = ?";
        $params[] = $tecnico_id;
    }

    if ($data_inicio) {
        $where[] = "sr.data_prevista >= ?";
        $params[] = $data_inicio;
    }

    if ($data_fim) {
        $where[] = "sr.data_prevista <= ?";
        $params[] = $data_fim;
    }

    $whereClause = !empty($where) ? 'WHERE ' . implode(' AND ', $where) : '';

    $sql = "
        SELECT 
            sr.*,
            u.nome as tecnico_nome,
            v.modelo as veiculo_modelo,
            v.placa as veiculo_placa,
            g.nome as gestor_nome,
            COUNT(rc.id) as total_clientes,
            SUM(rc.tempo_estimado) as tempo_total_estimado,
            CASE 
                WHEN sr.status = 'pendente' THEN 'Aguardando Aprovação'
                WHEN sr.status = 'aprovada' THEN 'Aprovada'
                WHEN sr.status = 'negada' THEN 'Negada'
                WHEN sr.status = 'em_execucao' THEN 'Em Execução'
                WHEN sr.status = 'concluida' THEN 'Concluída'
                WHEN sr.status = 'cancelada' THEN 'Cancelada'
            END as status_descricao
        FROM solicitacoes_rotas sr
        LEFT JOIN usuarios u ON sr.tecnico_id = u.id
        LEFT JOIN veiculos v ON sr.veiculo_id = v.id
        LEFT JOIN usuarios g ON sr.gestor_id = g.id
        LEFT JOIN rota_clientes rc ON sr.id = rc.solicitacao_rota_id
        $whereClause
        GROUP BY sr.id
        ORDER BY sr.created_at DESC
        LIMIT ? OFFSET ?
    ";

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

    $stmt = $pdo->prepare($sql);
    $stmt->execute($params);
    $rotas = $stmt->fetchAll();

    // Contar total de registros
    $sqlCount = "
        SELECT COUNT(DISTINCT sr.id) as total
        FROM solicitacoes_rotas sr
        LEFT JOIN rota_clientes rc ON sr.id = rc.solicitacao_rota_id
        $whereClause
    ";
    
    $stmtCount = $pdo->prepare($sqlCount);
    $stmtCount->execute(array_slice($params, 0, -2)); // Remover LIMIT e OFFSET
    $total = $stmtCount->fetch()['total'];

    resposta(true, [
        'rotas' => $rotas,
        'paginacao' => [
            'total' => intval($total),
            'pagina' => $pagina,
            'limite' => $limite,
            'total_paginas' => ceil($total / $limite)
        ]
    ], 'Rotas listadas com sucesso');
}

/**
 * Detalhes de uma rota específica
 */
function detalhesRota($pdo, $metodo) {
    if ($metodo !== 'GET') {
        resposta(false, null, 'Método não permitido', 405);
    }

    $id = $_GET['id'] ?? null;
    if (!$id || !is_numeric($id)) {
        resposta(false, null, 'ID da rota é obrigatório', 400);
    }

    // Buscar dados da rota
    $sql = "
        SELECT 
            sr.*,
            u.nome as tecnico_nome,
            u.email as tecnico_email,
            v.modelo as veiculo_modelo,
            v.placa as veiculo_placa,
            v.marca as veiculo_marca,
            g.nome as gestor_nome,
            g.email as gestor_email
        FROM solicitacoes_rotas sr
        LEFT JOIN usuarios u ON sr.tecnico_id = u.id
        LEFT JOIN veiculos v ON sr.veiculo_id = v.id
        LEFT JOIN usuarios g ON sr.gestor_id = g.id
        WHERE sr.id = ?
    ";

    $stmt = $pdo->prepare($sql);
    $stmt->execute([$id]);
    $rota = $stmt->fetch();

    if (!$rota) {
        resposta(false, null, 'Rota não encontrada', 404);
    }

    // Buscar clientes da rota
    $sql = "
        SELECT *
        FROM rota_clientes
        WHERE solicitacao_rota_id = ?
        ORDER BY ordem_sequencia ASC
    ";

    $stmt = $pdo->prepare($sql);
    $stmt->execute([$id]);
    $clientes = $stmt->fetchAll();

    $rota['clientes'] = $clientes;
    $rota['total_clientes'] = count($clientes);
    $rota['tempo_total_estimado'] = array_sum(array_column($clientes, 'tempo_estimado'));

    resposta(true, $rota, 'Detalhes da rota carregados');
}

/**
 * Aprovar rota
 */
function aprovarRota($pdo, $metodo) {
    if ($metodo !== 'POST') {
        resposta(false, null, 'Método não permitido', 405);
    }

    $input = json_decode(file_get_contents('php://input'), true);
    $id = $input['id'] ?? null;
    $gestor_id = $input['gestor_id'] ?? 'admin'; // Por enquanto usar admin
    $justificativa = $input['justificativa'] ?? 'Rota aprovada pelo gestor';

    if (!$id || !is_numeric($id)) {
        resposta(false, null, 'ID da rota é obrigatório', 400);
    }

    $pdo->beginTransaction();

    try {
        // Verificar se a rota existe e está pendente
        $stmt = $pdo->prepare("SELECT * FROM solicitacoes_rotas WHERE id = ? AND status = 'pendente'");
        $stmt->execute([$id]);
        $rota = $stmt->fetch();

        if (!$rota) {
            resposta(false, null, 'Rota não encontrada ou já processada', 404);
        }

        // Atualizar status da rota
        $sql = "UPDATE solicitacoes_rotas SET 
                status = 'aprovada', 
                gestor_id = ?, 
                data_resposta = NOW(), 
                justificativa_gestor = ? 
                WHERE id = ?";
        
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$gestor_id, $justificativa, $id]);

        // Gerar viagens automaticamente (será implementado depois)
        // gerarViagensAutomaticamente($pdo, $id);

        // Notificar técnico sobre aprovação
        notificarTecnico($pdo, $rota['tecnico_id'], 'aprovacao_rota', [
            'rota_titulo' => $rota['titulo'],
            'gestor' => $gestor_id
        ]);

        $pdo->commit();

        resposta(true, ['id' => $id], 'Rota aprovada com sucesso');

    } catch (Exception $e) {
        $pdo->rollBack();
        throw $e;
    }
}

/**
 * Negar rota
 */
function negarRota($pdo, $metodo) {
    if ($metodo !== 'POST') {
        resposta(false, null, 'Método não permitido', 405);
    }

    $input = json_decode(file_get_contents('php://input'), true);
    $id = $input['id'] ?? null;
    $gestor_id = $input['gestor_id'] ?? 'admin';
    $justificativa = $input['justificativa'] ?? null;

    if (!$id || !is_numeric($id)) {
        resposta(false, null, 'ID da rota é obrigatório', 400);
    }

    if (!$justificativa) {
        resposta(false, null, 'Justificativa é obrigatória para negar uma rota', 400);
    }

    // Verificar se a rota existe e está pendente
    $stmt = $pdo->prepare("SELECT * FROM solicitacoes_rotas WHERE id = ? AND status = 'pendente'");
    $stmt->execute([$id]);
    $rota = $stmt->fetch();

    if (!$rota) {
        resposta(false, null, 'Rota não encontrada ou já processada', 404);
    }

    // Atualizar status da rota
    $sql = "UPDATE solicitacoes_rotas SET 
            status = 'negada', 
            gestor_id = ?, 
            data_resposta = NOW(), 
            justificativa_gestor = ? 
            WHERE id = ?";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$gestor_id, $justificativa, $id]);

    // Notificar técnico sobre negação
    notificarTecnico($pdo, $rota['tecnico_id'], 'negacao_rota', [
        'rota_titulo' => $rota['titulo'],
        'justificativa' => $justificativa,
        'gestor' => $gestor_id
    ]);

    resposta(true, ['id' => $id], 'Rota negada');
}

/**
 * Estatísticas de rotas
 */
function estatisticasRotas($pdo, $metodo) {
    if ($metodo !== 'GET') {
        resposta(false, null, 'Método não permitido', 405);
    }

    $sql = "
        SELECT 
            COUNT(*) as total_rotas,
            SUM(CASE WHEN status = 'pendente' THEN 1 ELSE 0 END) as pendentes,
            SUM(CASE WHEN status = 'aprovada' THEN 1 ELSE 0 END) as aprovadas,
            SUM(CASE WHEN status = 'negada' THEN 1 ELSE 0 END) as negadas,
            SUM(CASE WHEN status = 'em_execucao' THEN 1 ELSE 0 END) as em_execucao,
            SUM(CASE WHEN status = 'concluida' THEN 1 ELSE 0 END) as concluidas,
            AVG(
                CASE WHEN status IN ('aprovada', 'negada') 
                THEN TIMESTAMPDIFF(HOUR, created_at, data_resposta) 
                ELSE NULL END
            ) as tempo_medio_resposta_horas
        FROM solicitacoes_rotas
    ";

    $stmt = $pdo->prepare($sql);
    $stmt->execute();
    $stats = $stmt->fetch();

    // Estatísticas de clientes
    $sql = "
        SELECT 
            COUNT(*) as total_clientes_rotas,
            AVG(tempo_estimado) as tempo_medio_por_cliente
        FROM rota_clientes
    ";

    $stmt = $pdo->prepare($sql);
    $stmt->execute();
    $statsClientes = $stmt->fetch();

    resposta(true, [
        'rotas' => $stats,
        'clientes' => $statsClientes
    ], 'Estatísticas carregadas');
}

/**
 * Notificar técnico
 */
function notificarTecnico($pdo, $tecnico_id, $tipo, $dados) {
    try {
        $titulo = '';
        $mensagem = '';

        switch ($tipo) {
            case 'aprovacao_rota':
                $titulo = 'Rota Aprovada';
                $mensagem = "Sua rota '{$dados['rota_titulo']}' foi aprovada! Você pode iniciar a execução.";
                break;
            case 'negacao_rota':
                $titulo = 'Rota Negada';
                $mensagem = "Sua rota '{$dados['rota_titulo']}' foi negada. Motivo: {$dados['justificativa']}";
                break;
        }

        $sql = "INSERT INTO notificacoes (user_id, titulo, mensagem, tipo) VALUES (?, ?, ?, 'info')";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$tecnico_id, $titulo, $mensagem]);

    } catch (Exception $e) {
        error_log("Erro ao notificar técnico: " . $e->getMessage());
    }
}
?>
