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

// Para requisições OPTIONS (preflight)
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    http_response_code(200);
    exit();
}

// Configurações do banco
$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,
    ]);
    
    $acao = $_GET['acao'] ?? $_POST['acao'] ?? '';
    
    switch ($acao) {
        case 'registrar_abastecimento':
            registrarAbastecimento($pdo);
            break;
            
        case 'buscar_por_viagem':
            buscarPorViagem($pdo);
            break;
            
        case 'buscar_por_veiculo':
            buscarPorVeiculo($pdo);
            break;
            
        case 'buscar_por_motorista':
            buscarPorMotorista($pdo);
            break;
            
        case 'relatorio_geral':
            relatorioGeral($pdo);
            break;
            
        case 'atualizar_sincronizacao':
            atualizarSincronizacao($pdo);
            break;
            
        default:
            echo json_encode([
                'success' => false,
                'message' => 'Ação não especificada. Ações disponíveis: registrar_abastecimento, buscar_por_viagem, buscar_por_veiculo, buscar_por_motorista, relatorio_geral, atualizar_sincronizacao'
            ]);
    }
    
} catch (PDOException $e) {
    echo json_encode([
        'success' => false,
        'message' => 'Erro de conexão com banco: ' . $e->getMessage()
    ]);
}

function registrarAbastecimento($pdo) {
    try {
        $dados = json_decode(file_get_contents('php://input'), true);
        
        // Validar dados obrigatórios
        $camposObrigatorios = ['viagem_id', 'veiculo_id', 'motorista_id', 'tipo_combustivel', 'quantidade_litros', 'valor_litro'];
        foreach ($camposObrigatorios as $campo) {
            if (!isset($dados[$campo]) || empty($dados[$campo])) {
                throw new Exception("Campo obrigatório não informado: {$campo}");
            }
        }
        
        // Calcular valor total
        $valorTotal = $dados['quantidade_litros'] * $dados['valor_litro'];
        
        // Preparar dados para inserção
        $sql = "INSERT INTO abastecimentos_rota (
            viagem_id, veiculo_id, motorista_id, data_hora, tipo_combustivel,
            quantidade_litros, valor_litro, valor_total, odometro_km,
            posto_combustivel, observacoes, foto_comprovante, sincronizado
        ) VALUES (
            :viagem_id, :veiculo_id, :motorista_id, :data_hora, :tipo_combustivel,
            :quantidade_litros, :valor_litro, :valor_total, :odometro_km,
            :posto_combustivel, :observacoes, :foto_comprovante, 1
        )";
        
        $stmt = $pdo->prepare($sql);
        $stmt->execute([
            'viagem_id' => $dados['viagem_id'],
            'veiculo_id' => $dados['veiculo_id'],
            'motorista_id' => $dados['motorista_id'],
            'data_hora' => $dados['data_hora'] ?? date('Y-m-d H:i:s'),
            'tipo_combustivel' => $dados['tipo_combustivel'],
            'quantidade_litros' => $dados['quantidade_litros'],
            'valor_litro' => $dados['valor_litro'],
            'valor_total' => $valorTotal,
            'odometro_km' => $dados['odometro_km'] ?? null,
            'posto_combustivel' => $dados['posto_combustivel'] ?? null,
            'observacoes' => $dados['observacoes'] ?? null,
            'foto_comprovante' => $dados['foto_comprovante'] ?? null
        ]);
        
        $id = $pdo->lastInsertId();
        
        echo json_encode([
            'success' => true,
            'message' => 'Abastecimento registrado com sucesso',
            'data' => [
                'id' => $id,
                'valor_total' => $valorTotal
            ]
        ]);
        
    } catch (Exception $e) {
        echo json_encode([
            'success' => false,
            'message' => 'Erro ao registrar abastecimento: ' . $e->getMessage()
        ]);
    }
}

function buscarPorViagem($pdo) {
    try {
        $viagemId = $_GET['viagemId'] ?? $_POST['viagemId'] ?? null;
        
        if (!$viagemId) {
            throw new Exception('ID da viagem não informado');
        }
        
        $sql = "SELECT a.*, 
                       v.data_inicio as viagem_data_inicio,
                       v.data_fim as viagem_data_fim,
                       vei.placa as veiculo_placa,
                       vei.modelo as veiculo_modelo,
                       m.nome as motorista_nome
                FROM abastecimentos_rota a
                LEFT JOIN viagens v ON a.viagem_id = v.id
                LEFT JOIN veiculos vei ON a.veiculo_id = vei.id
                LEFT JOIN motoristas m ON a.motorista_id = m.id
                WHERE a.viagem_id = :viagem_id
                ORDER BY a.data_hora DESC";
        
        $stmt = $pdo->prepare($sql);
        $stmt->execute(['viagem_id' => $viagemId]);
        $abastecimentos = $stmt->fetchAll();
        
        // Calcular totais
        $totalLitros = 0;
        $totalValor = 0;
        foreach ($abastecimentos as $abastecimento) {
            $totalLitros += $abastecimento['quantidade_litros'];
            $totalValor += $abastecimento['valor_total'];
        }
        
        echo json_encode([
            'success' => true,
            'data' => $abastecimentos,
            'resumo' => [
                'total_abastecimentos' => count($abastecimentos),
                'total_litros' => $totalLitros,
                'total_valor' => $totalValor
            ]
        ]);
        
    } catch (Exception $e) {
        echo json_encode([
            'success' => false,
            'message' => 'Erro ao buscar abastecimentos: ' . $e->getMessage()
        ]);
    }
}

function buscarPorVeiculo($pdo) {
    try {
        $veiculoId = $_GET['veiculoId'] ?? $_POST['veiculoId'] ?? null;
        $dataInicio = $_GET['dataInicio'] ?? $_POST['dataInicio'] ?? null;
        $dataFim = $_GET['dataFim'] ?? $_POST['dataFim'] ?? null;
        
        if (!$veiculoId) {
            throw new Exception('ID do veículo não informado');
        }
        
        $where = ['a.veiculo_id = :veiculo_id'];
        $params = ['veiculo_id' => $veiculoId];
        
        if ($dataInicio) {
            $where[] = 'a.data_hora >= :data_inicio';
            $params['data_inicio'] = $dataInicio . ' 00:00:00';
        }
        
        if ($dataFim) {
            $where[] = 'a.data_hora <= :data_fim';
            $params['data_fim'] = $dataFim . ' 23:59:59';
        }
        
        $sql = "SELECT a.*, 
                       v.data_inicio as viagem_data_inicio,
                       v.data_fim as viagem_data_fim,
                       vei.placa as veiculo_placa,
                       vei.modelo as veiculo_modelo,
                       m.nome as motorista_nome
                FROM abastecimentos_rota a
                LEFT JOIN viagens v ON a.viagem_id = v.id
                LEFT JOIN veiculos vei ON a.veiculo_id = vei.id
                LEFT JOIN motoristas m ON a.motorista_id = m.id
                WHERE " . implode(' AND ', $where) . "
                ORDER BY a.data_hora DESC";
        
        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
        $abastecimentos = $stmt->fetchAll();
        
        echo json_encode([
            'success' => true,
            'data' => $abastecimentos
        ]);
        
    } catch (Exception $e) {
        echo json_encode([
            'success' => false,
            'message' => 'Erro ao buscar abastecimentos: ' . $e->getMessage()
        ]);
    }
}

function buscarPorMotorista($pdo) {
    try {
        $motoristaId = $_GET['motoristaId'] ?? $_POST['motoristaId'] ?? null;
        $dataInicio = $_GET['dataInicio'] ?? $_POST['dataInicio'] ?? null;
        $dataFim = $_GET['dataFim'] ?? $_POST['dataFim'] ?? null;
        
        if (!$motoristaId) {
            throw new Exception('ID do motorista não informado');
        }
        
        $where = ['a.motorista_id = :motorista_id'];
        $params = ['motorista_id' => $motoristaId];
        
        if ($dataInicio) {
            $where[] = 'a.data_hora >= :data_inicio';
            $params['data_inicio'] = $dataInicio . ' 00:00:00';
        }
        
        if ($dataFim) {
            $where[] = 'a.data_hora <= :data_fim';
            $params['data_fim'] = $dataFim . ' 23:59:59';
        }
        
        $sql = "SELECT a.*, 
                       v.data_inicio as viagem_data_inicio,
                       v.data_fim as viagem_data_fim,
                       vei.placa as veiculo_placa,
                       vei.modelo as veiculo_modelo,
                       m.nome as motorista_nome
                FROM abastecimentos_rota a
                LEFT JOIN viagens v ON a.viagem_id = v.id
                LEFT JOIN veiculos vei ON a.veiculo_id = vei.id
                LEFT JOIN motoristas m ON a.motorista_id = m.id
                WHERE " . implode(' AND ', $where) . "
                ORDER BY a.data_hora DESC";
        
        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
        $abastecimentos = $stmt->fetchAll();
        
        echo json_encode([
            'success' => true,
            'data' => $abastecimentos
        ]);
        
    } catch (Exception $e) {
        echo json_encode([
            'success' => false,
            'message' => 'Erro ao buscar abastecimentos: ' . $e->getMessage()
        ]);
    }
}

function relatorioGeral($pdo) {
    try {
        $dataInicio = $_GET['dataInicio'] ?? $_POST['dataInicio'] ?? date('Y-m-01');
        $dataFim = $_GET['dataFim'] ?? $_POST['dataFim'] ?? date('Y-m-d');
        
        // Relatório por veículo
        $sqlVeiculos = "SELECT 
            vei.placa,
            vei.modelo,
            COUNT(a.id) as total_abastecimentos,
            SUM(a.quantidade_litros) as total_litros,
            SUM(a.valor_total) as total_valor,
            AVG(a.valor_litro) as media_valor_litro
        FROM abastecimentos_rota a
        LEFT JOIN veiculos vei ON a.veiculo_id = vei.id
        WHERE a.data_hora BETWEEN :data_inicio AND :data_fim
        GROUP BY a.veiculo_id, vei.placa, vei.modelo
        ORDER BY total_valor DESC";
        
        $stmt = $pdo->prepare($sqlVeiculos);
        $stmt->execute([
            'data_inicio' => $dataInicio . ' 00:00:00',
            'data_fim' => $dataFim . ' 23:59:59'
        ]);
        $relatorioVeiculos = $stmt->fetchAll();
        
        // Relatório por motorista
        $sqlMotoristas = "SELECT 
            m.nome as motorista_nome,
            COUNT(a.id) as total_abastecimentos,
            SUM(a.quantidade_litros) as total_litros,
            SUM(a.valor_total) as total_valor
        FROM abastecimentos_rota a
        LEFT JOIN motoristas m ON a.motorista_id = m.id
        WHERE a.data_hora BETWEEN :data_inicio AND :data_fim
        GROUP BY a.motorista_id, m.nome
        ORDER BY total_valor DESC";
        
        $stmt = $pdo->prepare($sqlMotoristas);
        $stmt->execute([
            'data_inicio' => $dataInicio . ' 00:00:00',
            'data_fim' => $dataFim . ' 23:59:59'
        ]);
        $relatorioMotoristas = $stmt->fetchAll();
        
        // Totais gerais
        $sqlTotais = "SELECT 
            COUNT(*) as total_abastecimentos,
            SUM(quantidade_litros) as total_litros,
            SUM(valor_total) as total_valor,
            AVG(valor_litro) as media_valor_litro
        FROM abastecimentos_rota
        WHERE data_hora BETWEEN :data_inicio AND :data_fim";
        
        $stmt = $pdo->prepare($sqlTotais);
        $stmt->execute([
            'data_inicio' => $dataInicio . ' 00:00:00',
            'data_fim' => $dataFim . ' 23:59:59'
        ]);
        $totais = $stmt->fetch();
        
        echo json_encode([
            'success' => true,
            'data' => [
                'periodo' => [
                    'data_inicio' => $dataInicio,
                    'data_fim' => $dataFim
                ],
                'totais_gerais' => $totais,
                'por_veiculo' => $relatorioVeiculos,
                'por_motorista' => $relatorioMotoristas
            ]
        ]);
        
    } catch (Exception $e) {
        echo json_encode([
            'success' => false,
            'message' => 'Erro ao gerar relatório: ' . $e->getMessage()
        ]);
    }
}

function atualizarSincronizacao($pdo) {
    try {
        $dados = json_decode(file_get_contents('php://input'), true);
        $ids = $dados['ids'] ?? [];
        
        if (empty($ids)) {
            throw new Exception('IDs não informados');
        }
        
        $placeholders = str_repeat('?,', count($ids) - 1) . '?';
        $sql = "UPDATE abastecimentos_rota SET sincronizado = 1 WHERE id IN ($placeholders)";
        
        $stmt = $pdo->prepare($sql);
        $stmt->execute($ids);
        
        echo json_encode([
            'success' => true,
            'message' => 'Sincronização atualizada com sucesso',
            'registros_atualizados' => $stmt->rowCount()
        ]);
        
    } catch (Exception $e) {
        echo json_encode([
            'success' => false,
            'message' => 'Erro ao atualizar sincronização: ' . $e->getMessage()
        ]);
    }
}
?>
