<?php
/**
 * API para salvar solicitações de rotas
 * Sistema de Autorização de Rotas com Múltiplos Clientes
 */

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');

// 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 = '') {
    echo json_encode([
        'sucesso' => $sucesso,
        'dados' => $dados,
        'mensagem' => $mensagem,
        'timestamp' => date('c')
    ], JSON_UNESCAPED_UNICODE);
    exit();
}

try {
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        resposta(false, null, 'Método não permitido');
    }

    // Pegar dados JSON
    $input = json_decode(file_get_contents('php://input'), true);
    
    if (!$input) {
        resposta(false, null, 'Dados JSON inválidos');
    }

    // Validar campos obrigatórios
    $camposObrigatorios = ['titulo', 'veiculo_id', 'data_prevista', 'hora_inicio', 'clientes'];
    foreach ($camposObrigatorios as $campo) {
        if (!isset($input[$campo]) || empty($input[$campo])) {
            resposta(false, null, "Campo obrigatório: $campo");
        }
    }

    if (!is_array($input['clientes']) || count($input['clientes']) === 0) {
        resposta(false, null, 'É necessário adicionar pelo menos um cliente à rota');
    }

    $pdo = conectarBanco();
    $pdo->beginTransaction();

    // Por enquanto, usar motorista ID 1 como padrão (depois vem do app via autenticação)
    $motorista_id = 1;

    // Calcular tempo e KM estimados
    $tempo_total_estimado = 0;
    foreach ($input['clientes'] as $cliente) {
        $tempo_total_estimado += intval($cliente['tempo_estimado'] ?? 60);
    }

    // Inserir solicitação de rota
    $sql = "INSERT INTO solicitacoes_rotas (
        motorista_id, veiculo_id, titulo, descricao, data_prevista, 
        hora_inicio_prevista, duracao_estimada, prioridade, status
    ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'pendente')";

    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        $motorista_id,
        intval($input['veiculo_id']),
        $input['titulo'],
        $input['descricao'] ?? null,
        $input['data_prevista'],
        $input['hora_inicio'],
        $tempo_total_estimado,
        $input['prioridade'] ?? 'normal'
    ]);

    $solicitacao_id = $pdo->lastInsertId();

    // Inserir clientes da rota
    $sql_cliente = "INSERT INTO rota_clientes (
        solicitacao_rota_id, nome_cliente, endereco, telefone, 
        motivo_atendimento, ordem_sequencia, tempo_estimado
    ) VALUES (?, ?, ?, ?, ?, ?, ?)";

    $stmt_cliente = $pdo->prepare($sql_cliente);

    foreach ($input['clientes'] as $index => $cliente) {
        $stmt_cliente->execute([
            $solicitacao_id,
            $cliente['nome'],
            $cliente['endereco'] ?? null,
            $cliente['telefone'] ?? null,
            $cliente['motivo'],
            $cliente['ordem'] ?? ($index + 1),
            intval($cliente['tempo_estimado'] ?? 60)
        ]);
    }

    // Enviar notificação para gestores (simular por enquanto)
    enviarNotificacaoGestores($pdo, $solicitacao_id, $input['titulo'], $motorista_id);

    $pdo->commit();

    // Log da operação
    error_log("Nova solicitação de rota criada - ID: $solicitacao_id, Título: {$input['titulo']}, Clientes: " . count($input['clientes']));

    resposta(true, [
        'solicitacao_id' => $solicitacao_id,
        'total_clientes' => count($input['clientes']),
        'tempo_estimado' => $tempo_total_estimado
    ], 'Solicitação de rota enviada com sucesso! Será analisada pelos gestores.');

} catch (Exception $e) {
    if (isset($pdo)) {
        $pdo->rollBack();
    }
    error_log("Erro ao salvar rota: " . $e->getMessage());
    resposta(false, null, 'Erro interno: ' . $e->getMessage());
}

/**
 * Função para enviar notificações para gestores
 */
function enviarNotificacaoGestores($pdo, $solicitacao_id, $titulo, $motorista_id) {
    try {
        // Buscar todos os gestores (motoristas com cargo de gestor/supervisor)
        $sql = "SELECT id, nome FROM motoristas WHERE status = 'ativo'";
        $stmt = $pdo->prepare($sql);
        $stmt->execute();
        $gestores = $stmt->fetchAll();

        if (empty($gestores)) {
            error_log("Nenhum gestor encontrado para notificar sobre a rota $solicitacao_id");
            return;
        }

        // Buscar nome do motorista
        $stmt = $pdo->prepare("SELECT nome FROM motoristas WHERE id = ?");
        $stmt->execute([$motorista_id]);
        $motorista = $stmt->fetch();
        $nome_motorista = $motorista['nome'] ?? "Motorista $motorista_id";

        // Por enquanto, apenas fazer log das notificações (depois implementar sistema real de notificações)
        foreach ($gestores as $gestor) {
            $mensagem = "Nova solicitação de rota: '$titulo' enviada por $nome_motorista. Clique para revisar e aprovar.";
            
            error_log("NOTIFICAÇÃO PARA GESTOR: {$gestor['nome']} - $mensagem (Rota ID: $solicitacao_id)");
        }

        // Aqui seria integrado o FCM para notificações push
        // Por enquanto, apenas log
        error_log("Notificações de rota $solicitacao_id enviadas para " . count($gestores) . " gestores");

    } catch (Exception $e) {
        error_log("Erro ao enviar notificações para gestores: " . $e->getMessage());
        // Não falhar a operação principal por causa da notificação
    }
}
?>
