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

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

require_once '../../config/database.php';

try {
    $pdo = new PDO($dsn, $username, $password, $options);
    
    $method = $_SERVER['REQUEST_METHOD'];
    $acao = $_GET['acao'] ?? '';

    switch ($method) {
        case 'POST':
            if ($acao === 'checklist_veiculo') {
                salvarChecklistVeiculo($pdo);
            } elseif ($acao === 'upload_foto') {
                uploadFotoProblema($pdo);
            } else {
                throw new Exception('Ação POST não reconhecida');
            }
            break;
            
        case 'GET':
            if ($acao === 'checklist_veiculo') {
                buscarChecklists($pdo);
            } elseif ($acao === 'tipos_veiculo') {
                listarTiposVeiculo();
            } else {
                statusAPI();
            }
            break;
            
        default:
            throw new Exception('Método HTTP não suportado');
    }

} catch (Exception $e) {
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'message' => 'Erro do servidor: ' . $e->getMessage(),
        'timestamp' => date('Y-m-d H:i:s')
    ]);
}

function salvarChecklistVeiculo($pdo) {
    try {
        // Obter dados JSON do corpo da requisição
        $input = file_get_contents('php://input');
        $dados = json_decode($input, true);
        
        if (!$dados) {
            throw new Exception('Dados JSON inválidos');
        }
        
        // Log dos dados recebidos ANTES da normalização
        error_log("CHECKLIST DEBUG - DADOS ORIGINAIS: " . json_encode($dados));
        
        // CORREÇÃO: O app Android envia campos com nomes diferentes
        // Normalizar os nomes dos campos para manter compatibilidade
        if (isset($dados['viagem_id'])) {
            $dados['viagemId'] = $dados['viagem_id'];
        }
        if (isset($dados['veiculo_id'])) {
            $dados['veiculoId'] = $dados['veiculo_id'];
        }
        if (isset($dados['tipo_veiculo'])) {
            $dados['tipoVeiculo'] = $dados['tipo_veiculo'];
        }
        if (isset($dados['data_hora'])) {
            $dados['dataHora'] = $dados['data_hora'];
        }
        if (isset($dados['itens_json'])) {
            $dados['itens'] = $dados['itens_json'];
        }
        if (isset($dados['observacoes_gerais'])) {
            $dados['observacoesGerais'] = $dados['observacoes_gerais'];
        }
        
        // Log dos dados APÓS normalização
        error_log("CHECKLIST DEBUG - DADOS NORMALIZADOS: viagemId={$dados['viagemId']}, veiculoId={$dados['veiculoId']}, dataHora={$dados['dataHora']}");
        
        // Validar campos obrigatórios
        $camposObrigatorios = ['viagemId', 'veiculoId', 'tipoVeiculo', 'dataHora', 'itens'];
        foreach ($camposObrigatorios as $campo) {
            if (!isset($dados[$campo])) {
                throw new Exception("Campo obrigatório ausente: $campo");
            }
        }
        
        // ==========================================
        // 🔧 BUSCAR TIPO CORRETO DO VEÍCULO
        // ==========================================
        // IGNORAR o tipo enviado pelo app e buscar o correto do banco
        $stmt_veiculo = $pdo->prepare("SELECT tipo FROM veiculos WHERE id = ?");
        $stmt_veiculo->execute([$dados['veiculoId']]);
        $veiculo_info = $stmt_veiculo->fetch(PDO::FETCH_ASSOC);
        
        if (!$veiculo_info) {
            throw new Exception("Veículo ID {$dados['veiculoId']} não encontrado na tabela de veículos");
        }
        
        // Usar o tipo CORRETO do banco, não o enviado pelo app
        $tipoVeiculoCorreto = strtoupper($veiculo_info['tipo']);
        
        // Log da correção se houve diferença
        $tipoEnviado = strtoupper($dados['tipoVeiculo']);
        if ($tipoEnviado !== $tipoVeiculoCorreto) {
            error_log("🔧 CORREÇÃO AUTOMÁTICA: App enviou '$tipoEnviado' mas veículo {$dados['veiculoId']} é '$tipoVeiculoCorreto'");
        }
        
        // Substituir o tipo enviado pelo app pelo tipo correto
        $dados['tipoVeiculo'] = $tipoVeiculoCorreto;
        
        // Converter ID local do app para ID real do servidor
        $viagemIdLocal = intval($dados['viagemId']);
        $veiculoId = intval($dados['veiculoId']);
        $dataHoraChecklist = $dados['dataHora'];
        
        // Log dos dados recebidos para debug
        error_log("CHECKLIST DEBUG: App enviou viagemId=$viagemIdLocal, veiculoId=$veiculoId, dataHora=$dataHoraChecklist");
        
        // CORREÇÃO FORÇADA: Buscar a viagem real no servidor
        $viagemReal = null;
        
        // Log detalhado dos parâmetros de busca
        $dataChecklist = date('Y-m-d', strtotime($dataHoraChecklist));
        error_log("CHECKLIST DEBUG DETALHADO: Buscando viagem para veiculoId=$veiculoId, dataChecklist=$dataChecklist, dataHoraOriginal=$dataHoraChecklist");
        
        // 1. BUSCA PRINCIPAL: Mesmo veículo, mesmo dia (com log detalhado)
        $sqlViagem1 = "SELECT id, data_inicio, veiculo_id, cliente FROM viagens 
                       WHERE veiculo_id = ? 
                       AND DATE(data_inicio) = ? 
                       ORDER BY data_inicio DESC 
                       LIMIT 1";
        
        $stmtViagem = $pdo->prepare($sqlViagem1);
        $stmtViagem->execute([$veiculoId, $dataChecklist]);
        $viagemReal = $stmtViagem->fetch();
        
        error_log("CHECKLIST DEBUG SQL1: $sqlViagem1 com params [$veiculoId, $dataChecklist]");
        
        if ($viagemReal) {
            error_log("CHECKLIST DEBUG: ✅ ENCONTROU viagem pelo critério 1: ID={$viagemReal['id']}, Cliente={$viagemReal['cliente']}, Data={$viagemReal['data_inicio']}");
        } else {
            error_log("CHECKLIST DEBUG: ❌ Não encontrou viagem pelo critério 1");
            
            // 2. BUSCA ALTERNATIVA: Mesmo veículo, hoje (CURDATE)
            $sqlViagem2 = "SELECT id, data_inicio, veiculo_id, cliente FROM viagens 
                           WHERE veiculo_id = ? 
                           AND DATE(data_inicio) = CURDATE() 
                           ORDER BY data_inicio DESC 
                           LIMIT 1";
            
            $stmtViagem = $pdo->prepare($sqlViagem2);
            $stmtViagem->execute([$veiculoId]);
            $viagemReal = $stmtViagem->fetch();
            
            error_log("CHECKLIST DEBUG SQL2: $sqlViagem2 com params [$veiculoId]");
            
            if ($viagemReal) {
                error_log("CHECKLIST DEBUG: ✅ ENCONTROU viagem pelo critério 2: ID={$viagemReal['id']}, Cliente={$viagemReal['cliente']}, Data={$viagemReal['data_inicio']}");
            } else {
                error_log("CHECKLIST DEBUG: ❌ Não encontrou viagem pelo critério 2");
                
                // 3. BUSCA EXPANDIDA: Últimas 48h
                $sqlViagem3 = "SELECT id, data_inicio, veiculo_id, cliente FROM viagens 
                               WHERE veiculo_id = ? 
                               AND data_inicio >= DATE_SUB(NOW(), INTERVAL 48 HOUR)
                               ORDER BY data_inicio DESC 
                               LIMIT 1";
                
                $stmtViagem = $pdo->prepare($sqlViagem3);
                $stmtViagem->execute([$veiculoId]);
                $viagemReal = $stmtViagem->fetch();
                
                error_log("CHECKLIST DEBUG SQL3: $sqlViagem3 com params [$veiculoId]");
                
                if ($viagemReal) {
                    error_log("CHECKLIST DEBUG: ✅ ENCONTROU viagem pelo critério 3: ID={$viagemReal['id']}, Cliente={$viagemReal['cliente']}, Data={$viagemReal['data_inicio']}");
                } else {
                    error_log("CHECKLIST DEBUG: ❌ Não encontrou viagem pelo critério 3");
                    
                    // 4. FALLBACK: Verificar se ID enviado existe
                    $sqlFallback = "SELECT id, data_inicio, veiculo_id, cliente FROM viagens WHERE id = ?";
                    $stmtFallback = $pdo->prepare($sqlFallback);
                    $stmtFallback->execute([$viagemIdLocal]);
                    $viagemReal = $stmtFallback->fetch();
                    
                    error_log("CHECKLIST DEBUG SQL4: $sqlFallback com params [$viagemIdLocal]");
                    
                    if ($viagemReal) {
                        error_log("CHECKLIST DEBUG: ✅ ENCONTROU viagem pelo critério 4 (ID direto): ID={$viagemReal['id']}, Cliente={$viagemReal['cliente']}, Data={$viagemReal['data_inicio']}");
                    } else {
                        error_log("CHECKLIST ERROR: ❌ NENHUMA viagem encontrada por TODOS os critérios! ViagemIdLocal=$viagemIdLocal, VeiculoId=$veiculoId, Data=$dataChecklist");
                        
                        // Log adicional para debug - listar todas as viagens hoje
                        $sqlDebug = "SELECT id, veiculo_id, cliente, data_inicio FROM viagens WHERE DATE(data_inicio) = CURDATE() ORDER BY id DESC LIMIT 5";
                        $stmtDebug = $pdo->query($sqlDebug);
                        $viagensHoje = $stmtDebug->fetchAll();
                        error_log("CHECKLIST DEBUG: Viagens disponíveis hoje: " . json_encode($viagensHoje));
                        
                        throw new Exception("Viagem não encontrada. ViagemId enviado: $viagemIdLocal, VeiculoId: $veiculoId, Data: $dataChecklist");
                    }
                }
            }
        }
        
        $viagemId = $viagemReal['id']; // ID real da viagem no servidor
        
        // Log da correção para debug
        error_log("CHECKLIST SUCCESS: Conversão de ID - App enviou: $viagemIdLocal, Usando: $viagemId");
        
        // Log adicional ANTES do INSERT para confirmar valores
        error_log("CHECKLIST INSERT DADOS: viagemId=$viagemId, veiculoId=$veiculoId, tipoVeiculo={$dados['tipoVeiculo']}");
        
        // Log em arquivo específico para debug
        $debugLog = "DEBUG " . date('Y-m-d H:i:s') . " - ANTES INSERT: viagemId=$viagemId, veiculoId=$veiculoId\n";
        file_put_contents('../../debug-checklist.log', $debugLog, FILE_APPEND);
        
        $tipoVeiculo = $dados['tipoVeiculo'];
        $dataHora = $dados['dataHora'];
        $itensJson = json_encode($dados['itens'], JSON_UNESCAPED_UNICODE);
        $observacoes = $dados['observacoesGerais'] ?? '';
        
        // Inserir checklist
        $sql = "INSERT INTO checklist_veiculo 
                (viagem_id, veiculo_id, tipo_veiculo, data_hora, itens, observacoes_gerais, status) 
                VALUES (?, ?, ?, ?, ?, ?, 'aprovado')";
                
        $stmt = $pdo->prepare($sql);
        $result = $stmt->execute([$viagemId, $veiculoId, $tipoVeiculo, $dataHora, $itensJson, $observacoes]);
        
        // Log APÓS o INSERT para confirmar
        $checklistId = $pdo->lastInsertId();
        error_log("CHECKLIST INSERT SUCESSO: ID=$checklistId, USOU viagemId=$viagemId");
        
        // Log em arquivo específico para debug  
        $debugLog = "DEBUG " . date('Y-m-d H:i:s') . " - APÓS INSERT: checklistId=$checklistId, USOU viagemId=$viagemId\n";
        file_put_contents('../../debug-checklist.log', $debugLog, FILE_APPEND);
        
        // Processar fotos se existirem
        $fotosProcessadas = 0;
        
        // ===== DEBUG FOTOS - LOGS PARA INVESTIGAÇÃO =====
        error_log("🔍 DEBUG FOTOS - Checklist ID: $checklistId");
        error_log("🔍 DEBUG FOTOS - Dados recebidos: " . json_encode($dados));
        
        if (isset($dados['fotos'])) {
            error_log("✅ DEBUG FOTOS - Array 'fotos' encontrado no JSON");
            error_log("📊 DEBUG FOTOS - Total de fotos: " . count($dados['fotos']));
            error_log("📸 DEBUG FOTOS - Dados das fotos: " . json_encode($dados['fotos']));
        } else {
            error_log("❌ DEBUG FOTOS - Array 'fotos' NÃO encontrado no JSON!");
            error_log("🔍 DEBUG FOTOS - Campos disponíveis: " . implode(', ', array_keys($dados)));
        }
        
        if (isset($dados['fotos']) && is_array($dados['fotos'])) {
            error_log("🚀 DEBUG FOTOS - Iniciando processamento...");
            $fotosProcessadas = processarFotos($pdo, $checklistId, $dados['fotos']);
            error_log("✅ DEBUG FOTOS - Processamento concluído. Fotos processadas: $fotosProcessadas");
        } else {
            error_log("⚠️ DEBUG FOTOS - Processamento pulado (sem fotos ou formato inválido)");
        }
        // ===== FIM DEBUG FOTOS =====
        
        echo json_encode([
            'success' => true,
            'message' => 'Checklist inserido com sucesso',
            'data' => [
                'id' => $checklistId,
                'viagemIdOriginal' => $viagemIdLocal,
                'viagemIdCorrigido' => $viagemId,
                'tipoVeiculo' => $tipoVeiculo,
                'totalItens' => count($dados['itens']),
                'fotosProcessadas' => $fotosProcessadas,
                'timestamp' => date('Y-m-d H:i:s')
            ]
        ]);
        
    } catch (Exception $e) {
        throw new Exception('Erro ao salvar checklist: ' . $e->getMessage());
    }
}

function processarFotos($pdo, $checklistId, $fotos) {
    error_log("🔍 FOTOS DEBUG - Iniciando processamento de fotos");
    error_log("🔍 FOTOS DEBUG - checklistId: $checklistId");
    error_log("🔍 FOTOS DEBUG - Array fotos recebido: " . json_encode($fotos));
    error_log("🔍 FOTOS DEBUG - Tipo do array fotos: " . gettype($fotos));
    error_log("🔍 FOTOS DEBUG - Total de fotos no array: " . (is_array($fotos) ? count($fotos) : 0));
    
    $fotosProcessadas = 0;
    $diretorioBase = '../../uploads/checklist-fotos/' . date('Y/m');
    
    error_log("🔍 FOTOS DEBUG - Diretório base: $diretorioBase");
    error_log("🔍 FOTOS DEBUG - Diretório existe: " . (file_exists($diretorioBase) ? 'SIM' : 'NÃO'));
    
    // Criar diretório se não existir
    if (!file_exists($diretorioBase)) {
        $criouDiretorio = mkdir($diretorioBase, 0755, true);
        error_log("🔍 FOTOS DEBUG - Tentou criar diretório: " . ($criouDiretorio ? 'SUCESSO' : 'FALHA'));
    }
    
    error_log("🔍 FOTOS DEBUG - Permissões do diretório: " . substr(sprintf('%o', fileperms($diretorioBase)), -4));
    error_log("🔍 FOTOS DEBUG - Diretório é gravável: " . (is_writable($diretorioBase) ? 'SIM' : 'NÃO'));
    
    if (!is_array($fotos)) {
        error_log("❌ FOTOS DEBUG - Array de fotos inválido ou vazio");
        return 0;
    }
    
    $fotoIndex = 0;
    foreach ($fotos as $foto) {
        $fotoIndex++;
        error_log("🔍 FOTOS DEBUG - Processando foto #$fotoIndex: " . json_encode($foto));
        
        try {
            // Verificar campos obrigatórios
            if (!isset($foto['itemId'])) {
                error_log("❌ FOTOS DEBUG - Foto #$fotoIndex: Campo 'itemId' ausente");
                continue;
            }
            
            if (!isset($foto['base64'])) {
                error_log("❌ FOTOS DEBUG - Foto #$fotoIndex: Campo 'base64' ausente");
                continue;
            }
            
            if (!isset($foto['descricao'])) {
                error_log("⚠️ FOTOS DEBUG - Foto #$fotoIndex: Campo 'descricao' ausente, usando padrão");
                $foto['descricao'] = 'Problema detectado';
            }
            
            error_log("✅ FOTOS DEBUG - Foto #$fotoIndex: Campos obrigatórios OK");
            error_log("🔍 FOTOS DEBUG - Foto #$fotoIndex: itemId={$foto['itemId']}, descricao={$foto['descricao']}");
            error_log("🔍 FOTOS DEBUG - Foto #$fotoIndex: Tamanho base64=" . strlen($foto['base64']) . " caracteres");
            
            // Decodificar base64
            $dadosImagem = base64_decode($foto['base64']);
            if ($dadosImagem === false) {
                error_log("❌ FOTOS DEBUG - Foto #$fotoIndex: Falha ao decodificar base64");
                continue;
            }
            
            $tamanhoImagem = strlen($dadosImagem);
            error_log("✅ FOTOS DEBUG - Foto #$fotoIndex: Base64 decodificado. Tamanho da imagem: $tamanhoImagem bytes");
            
            // Gerar nome único para o arquivo
            $extensao = 'jpg'; // Padrão para fotos de celular
            $nomeArquivo = $checklistId . '_' . $foto['itemId'] . '_' . time() . '_' . uniqid() . '.' . $extensao;
            $caminhoCompleto = $diretorioBase . '/' . $nomeArquivo;
            
            error_log("🔍 FOTOS DEBUG - Foto #$fotoIndex: Nome arquivo=$nomeArquivo");
            error_log("🔍 FOTOS DEBUG - Foto #$fotoIndex: Caminho completo=$caminhoCompleto");
            
            // Salvar arquivo
            $bytesEscritos = file_put_contents($caminhoCompleto, $dadosImagem);
            if ($bytesEscritos !== false) {
                error_log("✅ FOTOS DEBUG - Foto #$fotoIndex: Arquivo salvo. Bytes escritos: $bytesEscritos");
                error_log("🔍 FOTOS DEBUG - Foto #$fotoIndex: Verificando se arquivo existe: " . (file_exists($caminhoCompleto) ? 'SIM' : 'NÃO'));
                
                // Inserir registro no banco
                $sql = "INSERT INTO checklist_fotos 
                        (checklist_id, item_id, nome_arquivo, caminho_arquivo, descricao_problema, tamanho_arquivo, tipo_mime) 
                        VALUES (?, ?, ?, ?, ?, ?, 'image/jpeg')";
                        
                $stmt = $pdo->prepare($sql);
                
                $parametros = [
                    $checklistId,
                    $foto['itemId'],
                    $nomeArquivo,
                    $caminhoCompleto,
                    $foto['descricao'],
                    $tamanhoImagem
                ];
                
                error_log("🔍 FOTOS DEBUG - Foto #$fotoIndex: SQL preparado: $sql");
                error_log("🔍 FOTOS DEBUG - Foto #$fotoIndex: Parâmetros: " . json_encode($parametros));
                
                $resultadoInsert = $stmt->execute($parametros);
                
                if ($resultadoInsert) {
                    $fotoId = $pdo->lastInsertId();
                    error_log("✅ FOTOS DEBUG - Foto #$fotoIndex: Inserido no banco com ID: $fotoId");
                    $fotosProcessadas++;
                } else {
                    $erroInfo = $stmt->errorInfo();
                    error_log("❌ FOTOS DEBUG - Foto #$fotoIndex: Falha ao inserir no banco. Erro: " . json_encode($erroInfo));
                }
            } else {
                error_log("❌ FOTOS DEBUG - Foto #$fotoIndex: Falha ao salvar arquivo no disco");
                error_log("🔍 FOTOS DEBUG - Foto #$fotoIndex: Erro do file_put_contents: " . error_get_last()['message']);
            }
            
        } catch (Exception $e) {
            error_log("❌ FOTOS DEBUG - Foto #$fotoIndex: Exception capturada: " . $e->getMessage());
            error_log("🔍 FOTOS DEBUG - Foto #$fotoIndex: Stack trace: " . $e->getTraceAsString());
        }
    }
    
    error_log("🎯 FOTOS DEBUG - Processamento finalizado. Total processadas: $fotosProcessadas de " . count($fotos) . " fotos");
    return $fotosProcessadas;
}

function uploadFotoProblema($pdo) {
    try {
        // Implementação para upload direto de fotos via multipart/form-data
        if (!isset($_FILES['foto']) || !isset($_POST['checklistId']) || !isset($_POST['itemId'])) {
            throw new Exception('Dados obrigatórios ausentes para upload');
        }
        
        $checklistId = intval($_POST['checklistId']);
        $itemId = $_POST['itemId'];
        $descricao = $_POST['descricao'] ?? '';
        
        $arquivo = $_FILES['foto'];
        
        // Validar arquivo
        if ($arquivo['error'] !== UPLOAD_ERR_OK) {
            throw new Exception('Erro no upload do arquivo');
        }
        
        $tiposPermitidos = ['image/jpeg', 'image/png', 'image/webp'];
        if (!in_array($arquivo['type'], $tiposPermitidos)) {
            throw new Exception('Tipo de arquivo não permitido');
        }
        
        // Processar upload...
        // (implementação similar ao processarFotos)
        
        echo json_encode([
            'success' => true,
            'message' => 'Foto enviada com sucesso'
        ]);
        
    } catch (Exception $e) {
        throw new Exception('Erro no upload: ' . $e->getMessage());
    }
}

function buscarChecklists($pdo) {
    try {
        $viagemId = $_GET['viagemId'] ?? null;
        $veiculoId = $_GET['veiculoId'] ?? null;
        $tipoVeiculo = $_GET['tipoVeiculo'] ?? null;
        
        $where = ['1=1'];
        $params = [];
        
        if ($viagemId) {
            $where[] = 'c.viagem_id = ?';
            $params[] = $viagemId;
        }
        
        if ($veiculoId) {
            $where[] = 'c.veiculo_id = ?';
            $params[] = $veiculoId;
        }
        
        if ($tipoVeiculo) {
            $where[] = 'c.tipo_veiculo = ?';
            $params[] = $tipoVeiculo;
        }
        
        $sql = "SELECT c.*, 
                       COUNT(f.id) as total_fotos
                FROM checklist_veiculo c
                LEFT JOIN checklist_fotos f ON c.id = f.checklist_id
                WHERE " . implode(' AND ', $where) . "
                GROUP BY c.id
                ORDER BY c.created_at DESC 
                LIMIT 50";
                
        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
        $checklists = $stmt->fetchAll(PDO::FETCH_ASSOC);
        
        echo json_encode([
            'success' => true,
            'message' => 'Checklists recuperados com sucesso',
            'data' => $checklists,
            'total' => count($checklists),
            'filtros' => [
                'tipo' => $tipoVeiculo,
                'viagemId' => $viagemId,
                'veiculoId' => $veiculoId
            ],
            'timestamp' => date('Y-m-d H:i:s')
        ]);
        
    } catch (Exception $e) {
        throw new Exception('Erro ao buscar checklists: ' . $e->getMessage());
    }
}

function listarTiposVeiculo() {
    echo json_encode([
        'success' => true,
        'message' => 'Tipos de veículo listados com sucesso',
        'data' => [
            ['codigo' => 'CARRO', 'nome' => 'Carro', 'totalItens' => 32],
            ['codigo' => 'MOTO', 'nome' => 'Moto', 'totalItens' => 24]
        ],
        'timestamp' => date('Y-m-d H:i:s')
    ]);
}

function statusAPI() {
    echo json_encode([
        'success' => true,
        'message' => 'API Checklist v3.0 - Suporte a Carros e Motos',
        'versao' => '3.0',
        'recursos' => [
            'checklist_carro' => true,
            'checklist_moto' => true,
            'upload_fotos' => true,
            'validacao_obrigatoria' => true,
            'correcao_ids_automatica' => true
        ],
        'timestamp' => date('Y-m-d H:i:s')
    ]);
}
?> 
