<?php
/**
 * API de Recebimento de Assinaturas de Entrega
 * Endpoint: api/recAssinaturasEntrega.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');

include_once('./classes/conexao.php');

// Validar token
if(!isset($_GET['token'])){
    echo json_encode([
        'code' => '400',
        'message' => 'Token não informado!'
    ], JSON_UNESCAPED_UNICODE);
    die();
}

$token = 'ajr123';
$chave = $_GET['token'];

if($chave !== $token){
    echo json_encode([
        'code' => '400',
        'message' => 'Token inválido!'
    ], JSON_UNESCAPED_UNICODE);
    die();
}

try {
    // Ler dados JSON do corpo da requisição
    $json = file_get_contents("php://input");
    $obj = json_decode($json);
    
    if (!$obj || !is_array($obj)) {
        echo json_encode([
            'code' => '400',
            'message' => 'Dados inválidos!'
        ], JSON_UNESCAPED_UNICODE);
        die();
    }
    
    $totalAssinaturas = count($obj);
    $sucessos = 0;
    $erros = 0;
    $detalhes = [];
    
    // Criar diretório de assinaturas se não existir
    $diretorioBase = './imagens/assinaturas/';
    if (!file_exists($diretorioBase)) {
        mkdir($diretorioBase, 0755, true);
    }
    
    // Processar cada assinatura
    foreach ($obj as $index => $item) {
        try {
            // Validar campos obrigatórios
            if (!isset($item->cte) || !isset($item->filial) || !isset($item->assinatura)) {
                $erros++;
                $detalhes[] = "Assinatura " . ($index + 1) . ": Campos obrigatórios faltando (cte, filial, assinatura)";
                continue;
            }
            
            $cte = $item->cte;
            $filial = $item->filial;
            $serie = isset($item->serie) ? $item->serie : '';
            $manifesto = isset($item->manifesto) ? $item->manifesto : '';
            $manfilial = isset($item->manfilial) ? $item->manfilial : '';
            $manserie = isset($item->manserie) ? $item->manserie : '';
            $placa = isset($item->placa) ? $item->placa : '';
            $usuario = isset($item->usuario) ? $item->usuario : '';
            $assinaturaBase64 = $item->assinatura;
            
            // Decodificar base64
            $assinaturaDecodificada = base64_decode($assinaturaBase64);
            
            if ($assinaturaDecodificada === false) {
                $erros++;
                $detalhes[] = "Assinatura " . ($index + 1) . ": Erro ao decodificar base64";
                continue;
            }
            
            // Gerar nome único para o arquivo
            $extensao = 'png';
            $nomeArquivoFinal = 'assinatura-' . $filial . '-' . $cte . '-' . time() . '.' . $extensao;
            $caminhoCompleto = $diretorioBase . $nomeArquivoFinal;
            
            // Salvar arquivo no servidor
            if (!file_put_contents($caminhoCompleto, $assinaturaDecodificada)) {
                $erros++;
                $detalhes[] = "Assinatura " . ($index + 1) . ": Erro ao salvar arquivo no servidor";
                continue;
            }
            
            // Verificar se já existe uma assinatura para este CTE
            $sqlCheck = "SELECT id FROM assinaturasentrega 
                        WHERE filial = :filial AND cte = :cte 
                        LIMIT 1";
            
            $stmtCheck = $conn->prepare($sqlCheck);
            $stmtCheck->bindParam(':filial', $filial, PDO::PARAM_STR);
            $stmtCheck->bindParam(':cte', $cte, PDO::PARAM_STR);
            $stmtCheck->execute();
            
            $existe = $stmtCheck->fetch(PDO::FETCH_ASSOC);
            
            if ($existe) {
                // Atualizar registro existente
                $sql = "UPDATE assinaturasentrega SET
                            serie = :serie,
                            manifesto = :manifesto,
                            manfilial = :manfilial,
                            manserie = :manserie,
                            placa = :placa,
                            arquivo = :arquivo,
                            usuario = :usuario,
                            dtrecebimento = CURRENT_TIMESTAMP()
                        WHERE filial = :filial AND cte = :cte";
                
                $stmt = $conn->prepare($sql);
                $stmt->bindParam(':serie', $serie, PDO::PARAM_STR);
                $stmt->bindParam(':manifesto', $manifesto, PDO::PARAM_STR);
                $stmt->bindParam(':manfilial', $manfilial, PDO::PARAM_STR);
                $stmt->bindParam(':manserie', $manserie, PDO::PARAM_STR);
                $stmt->bindParam(':placa', $placa, PDO::PARAM_STR);
                $stmt->bindParam(':arquivo', $nomeArquivoFinal, PDO::PARAM_STR);
                $stmt->bindParam(':usuario', $usuario, PDO::PARAM_STR);
                $stmt->bindParam(':filial', $filial, PDO::PARAM_STR);
                $stmt->bindParam(':cte', $cte, PDO::PARAM_STR);
                
                if ($stmt->execute()) {
                    $sucessos++;
                    $detalhes[] = "Assinatura " . ($index + 1) . ": Atualizada com sucesso - $nomeArquivoFinal";
                } else {
                    $erros++;
                    $detalhes[] = "Assinatura " . ($index + 1) . ": Erro ao atualizar no banco de dados";
                    @unlink($caminhoCompleto);
                }
            } else {
                // Inserir novo registro
                $sql = "INSERT INTO assinaturasentrega (
                            cte, filial, serie, manifesto, manfilial, manserie,
                            placa, arquivo, usuario, dtrecebimento
                        ) VALUES (
                            :cte, :filial, :serie, :manifesto, :manfilial, :manserie,
                            :placa, :arquivo, :usuario, CURRENT_TIMESTAMP()
                        )";
                
                $stmt = $conn->prepare($sql);
                $stmt->bindParam(':cte', $cte, PDO::PARAM_STR);
                $stmt->bindParam(':filial', $filial, PDO::PARAM_STR);
                $stmt->bindParam(':serie', $serie, PDO::PARAM_STR);
                $stmt->bindParam(':manifesto', $manifesto, PDO::PARAM_STR);
                $stmt->bindParam(':manfilial', $manfilial, PDO::PARAM_STR);
                $stmt->bindParam(':manserie', $manserie, PDO::PARAM_STR);
                $stmt->bindParam(':placa', $placa, PDO::PARAM_STR);
                $stmt->bindParam(':arquivo', $nomeArquivoFinal, PDO::PARAM_STR);
                $stmt->bindParam(':usuario', $usuario, PDO::PARAM_STR);
                
                if ($stmt->execute()) {
                    $sucessos++;
                    $detalhes[] = "Assinatura " . ($index + 1) . ": Inserida com sucesso - $nomeArquivoFinal";
                } else {
                    $erros++;
                    $detalhes[] = "Assinatura " . ($index + 1) . ": Erro ao inserir no banco de dados";
                    @unlink($caminhoCompleto);
                }
            }
            
        } catch (Exception $e) {
            $erros++;
            $detalhes[] = "Assinatura " . ($index + 1) . ": Erro - " . $e->getMessage();
        }
    }
    
    // Retornar resultado
    echo json_encode([
        'code' => '200',
        'message' => "Processamento concluído",
        'total' => $totalAssinaturas,
        'sucesso' => $sucessos,
        'erros' => $erros,
        'detalhes' => $detalhes
    ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    
} catch (PDOException $e) {
    echo json_encode([
        'code' => '500',
        'message' => 'Erro no banco de dados: ' . $e->getMessage()
    ], JSON_UNESCAPED_UNICODE);
} catch (Exception $e) {
    echo json_encode([
        'code' => '500',
        'message' => 'Erro interno: ' . $e->getMessage()
    ], JSON_UNESCAPED_UNICODE);
}
?>