<?php
/**
 * API de Checkin Entregas - InovTracking
 * Descrição: Recebe e armazena dados de check-in de entregas
 */

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

// Incluir conexão
include_once('./classes/conexao.php');

/**
 * Validar token de autenticação
 */
function validarToken($token) {
    $tokenValido = 'ajr123';
    return $token === $tokenValido;
}

/**
 * Retornar erro em JSON
 */
function retornarErro($codigo, $mensagem) {
    echo json_encode([
        'code' => $codigo,
        'message' => $mensagem,
        'success' => false
    ], JSON_UNESCAPED_UNICODE);
    die();
}

/**
 * Sanitizar entrada
 */
function sanitizar($valor) {
    return htmlspecialchars(strip_tags(trim($valor)));
}

/**
 * Validar campos obrigatórios
 */
function validarCampos($checkin) {
    $camposObrigatorios = ['placa', 'usuario', 'latitude', 'longitude', 'dtcheckin', 'filial', 'cte'];
    
    foreach ($camposObrigatorios as $campo) {
        if (!isset($checkin[$campo]) || empty($checkin[$campo])) {
            return [
                'valido' => false,
                'mensagem' => "Campo obrigatório ausente: {$campo}"
            ];
        }
    }
    
    return ['valido' => true];
}

// ============================================================================
// VALIDAÇÕES
// ============================================================================

// Verificar se token foi enviado
if (!isset($_GET['token'])) {
    retornarErro('400', 'Token não informado!');
}

// Validar token
if (!validarToken($_GET['token'])) {
    retornarErro('401', 'Token inválido!');
}

// Verificar método HTTP
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    retornarErro('405', 'Método não permitido. Use POST.');
}

// ============================================================================
// PROCESSAR REQUEST
// ============================================================================

try {
    // Obter dados JSON do body
    $jsonData = file_get_contents('php://input');
    
    if (empty($jsonData)) {
        retornarErro('400', 'Nenhum dado enviado no body da requisição');
    }
    
    $checkins = json_decode($jsonData, true);
    
    if (json_last_error() !== JSON_ERROR_NONE) {
        retornarErro('400', 'JSON inválido: ' . json_last_error_msg());
    }
    
    // Se não for array, transforma em array
    if (!is_array($checkins)) {
        retornarErro('400', 'Formato inválido. Esperado um array de check-ins.');
    }
    
    // Se for array mas não é lista (objeto), coloca dentro de array
    if (isset($checkins['placa'])) {
        $checkins = [$checkins];
    }
    
    if (count($checkins) === 0) {
        retornarErro('400', 'Nenhum check-in para processar');
    }
    
    // Verificar se conexão existe
    if (!isset($conn)) {
        retornarErro('500', 'Erro: Conexão com banco de dados não estabelecida');
    }
    
    // Iniciar transação
    $conn->beginTransaction();
    
    $sucesso = 0;
    $erros = 0;
    $detalhes = [];
    
    // Processar cada check-in
    foreach ($checkins as $index => $checkin) {
        try {
            // Validar campos obrigatórios
            $validacao = validarCampos($checkin);
            if (!$validacao['valido']) {
                $erros++;
                $detalhes[] = [
                    'index' => $index,
                    'filial' => $checkin['filial'] ?? 'N/A',
                    'cte' => $checkin['cte'] ?? 'N/A',
                    'erro' => $validacao['mensagem']
                ];
                continue;
            }
            
            // Sanitizar dados
            $placa = sanitizar($checkin['placa']);
            $usuario = sanitizar($checkin['usuario']);
            $latitude = sanitizar($checkin['latitude']);
            $longitude = sanitizar($checkin['longitude']);
            $dtcheckin = sanitizar($checkin['dtcheckin']);
            $filial = sanitizar($checkin['filial']);
            $cte = sanitizar($checkin['cte']);
            $manfilial = isset($checkin['manfilial']) ? sanitizar($checkin['manfilial']) : '';
            $manmanife = isset($checkin['manmanife']) ? sanitizar($checkin['manmanife']) : '';
            $manserie = isset($checkin['manserie']) ? sanitizar($checkin['manserie']) : '';
            
            // Verificar se já existe (evitar duplicatas)
            $sqlVerifica = "SELECT COUNT(*) as total 
                           FROM checkinentrega 
                           WHERE filial = :filial 
                           AND cte = :cte 
                           AND placa = :placa
                           AND dtcheckin = :dtcheckin";
            
            $stmtVerifica = $conn->prepare($sqlVerifica);
            $stmtVerifica->bindParam(':filial', $filial);
            $stmtVerifica->bindParam(':cte', $cte);
            $stmtVerifica->bindParam(':placa', $placa);
            $stmtVerifica->bindParam(':dtcheckin', $dtcheckin);
            $stmtVerifica->execute();
            
            $resultado = $stmtVerifica->fetch(PDO::FETCH_ASSOC);
            
            if ($resultado['total'] > 0) {
                // Já existe, pula
                $detalhes[] = [
                    'index' => $index,
                    'filial' => $filial,
                    'cte' => $cte,
                    'status' => 'duplicado'
                ];
                continue;
            }
            
            // Inserir check-in
            $sql = "INSERT INTO checkinentrega (
                        placa, usuario, latitude, longitude, dtcheckin, 
                        filial, cte, manfilial, manmanife, manserie
                    ) VALUES (
                        :placa, :usuario, :latitude, :longitude, :dtcheckin,
                        :filial, :cte, :manfilial, :manmanife, :manserie
                    )";
            
            $stmt = $conn->prepare($sql);
            $stmt->bindParam(':placa', $placa);
            $stmt->bindParam(':usuario', $usuario);
            $stmt->bindParam(':latitude', $latitude);
            $stmt->bindParam(':longitude', $longitude);
            $stmt->bindParam(':dtcheckin', $dtcheckin);
            $stmt->bindParam(':filial', $filial);
            $stmt->bindParam(':cte', $cte);
            $stmt->bindParam(':manfilial', $manfilial);
            $stmt->bindParam(':manmanife', $manmanife);
            $stmt->bindParam(':manserie', $manserie);
            
            if ($stmt->execute()) {
                $sucesso++;
                $detalhes[] = [
                    'index' => $index,
                    'filial' => $filial,
                    'cte' => $cte,
                    'status' => 'inserido'
                ];
            } else {
                $erros++;
                $detalhes[] = [
                    'index' => $index,
                    'filial' => $filial,
                    'cte' => $cte,
                    'erro' => 'Erro ao inserir no banco'
                ];
            }
            
        } catch (Exception $e) {
            $erros++;
            $detalhes[] = [
                'index' => $index,
                'filial' => $checkin['filial'] ?? 'N/A',
                'cte' => $checkin['cte'] ?? 'N/A',
                'erro' => $e->getMessage()
            ];
        }
    }
    
    // Commit da transação
    $conn->commit();
    
    // Retornar resultado
    $response = [
        'code' => '200',
        'message' => "Check-ins processados: {$sucesso} sucesso, {$erros} erros",
        'success' => true,
        'total' => count($checkins),
        'sucesso' => $sucesso,
        'erros' => $erros,
        'detalhes' => $detalhes
    ];
    
    echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    
} catch (PDOException $e) {
    // Rollback em caso de erro
    if (isset($conn)) {
        $conn->rollBack();
    }
    
    error_log("Erro PDO em recCheckinEntrega.php: " . $e->getMessage());
    retornarErro('500', 'Erro no banco de dados: ' . $e->getMessage());
    
} catch (Exception $e) {
    // Rollback em caso de erro
    if (isset($conn)) {
        $conn->rollBack();
    }
    
    error_log("Erro em recCheckinEntrega.php: " . $e->getMessage());
    retornarErro('500', 'Erro ao processar check-ins: ' . $e->getMessage());
}
?>