<?php
/**
 * API: Subir y concatenar facturas PDF por día
 */
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');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit;
}

require_once __DIR__ . '/../config/db.php';
require_once __DIR__ . '/../vendor/autoload.php';

use setasign\Fpdi\Tcpdf\Fpdi;

if (realpath($_SERVER['SCRIPT_FILENAME']) === realpath(__FILE__)) {
    $action = $_GET['action'] ?? 'subir';

    try {
        $pdo = getConnection();

        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            throw new Exception("Método no permitido");
        }

        $fecha = $_POST['fecha'] ?? '';
        if (empty($fecha)) {
            throw new Exception("La fecha es obligatoria");
        }

        // Validar formato fecha YYYY-MM-DD
        if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $fecha)) {
            throw new Exception("Formato de fecha inválido. Debe ser YYYY-MM-DD");
        }

        if (empty($_FILES['pdfFiles']['name'][0])) {
            throw new Exception("Debe subir al menos un archivo PDF");
        }

        $pdo->beginTransaction();

        // 1. Obtener o crear el registro del día
        $stmtDia = $pdo->prepare("SELECT id, pdf_concatenado FROM factura_dias_pdf WHERE fecha = :fecha");
        $stmtDia->execute([':fecha' => $fecha]);
        $dia = $stmtDia->fetch();

        if ($dia) {
            $diaId = intval($dia['id']);
        } else {
            $stmtInsDia = $pdo->prepare("INSERT INTO factura_dias_pdf (fecha, total_archivos) VALUES (:fecha, 0)");
            $stmtInsDia->execute([':fecha' => $fecha]);
            $diaId = intval($pdo->lastInsertId());
        }

        $uploadDir = __DIR__ . '/../uploads/originales/';
        $concatDir = __DIR__ . '/../uploads/concatenados/';

        // Obtener el último orden
        $stmtOrden = $pdo->prepare("SELECT COALESCE(MAX(orden), 0) FROM factura_archivos_pdf WHERE dia_id = :dia_id");
        $stmtOrden->execute([':dia_id' => $diaId]);
        $maxOrden = intval($stmtOrden->fetchColumn());

        $filesCount = count($_FILES['pdfFiles']['name']);
        $insertedFiles = [];

        // 2. Procesar y guardar cada archivo
        for ($i = 0; $i < $filesCount; $i++) {
            if ($_FILES['pdfFiles']['error'][$i] !== UPLOAD_ERR_OK) {
                throw new Exception("Error al subir archivo: " . $_FILES['pdfFiles']['name'][$i]);
            }

            $fileName = $_FILES['pdfFiles']['name'][$i];
            $fileTmp = $_FILES['pdfFiles']['tmp_name'][$i];
            $fileSize = $_FILES['pdfFiles']['size'][$i];
            $ext = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));

            if ($ext !== 'pdf') {
                throw new Exception("Solo se permiten archivos PDF. Archivo no válido: $fileName");
            }

            $uniqueName = $fecha . '_' . time() . '_' . uniqid() . '.pdf';
            $destPath = $uploadDir . $uniqueName;

            if (!move_uploaded_file($fileTmp, $destPath)) {
                throw new Exception("Error al guardar archivo en el servidor: $fileName");
            }

            // Insertar en la DB
            $maxOrden++;
            $stmtFile = $pdo->prepare("
                INSERT INTO factura_archivos_pdf (dia_id, nombre_original, ruta_archivo, tamano_bytes, orden)
                VALUES (:dia_id, :orig, :ruta, :tam, :ord)
            ");
            $stmtFile->execute([
                ':dia_id' => $diaId,
                ':orig'   => $fileName,
                ':ruta'   => 'uploads/originales/' . $uniqueName,
                ':tam'    => $fileSize,
                ':ord'    => $maxOrden
            ]);
        }

        $pdo->commit();

        // 3. Concatenar todos los archivos para este día
        $concatResult = concatenarPDFs($diaId, $fecha, $pdo);

        echo json_encode([
            'success' => true,
            'message' => "Facturas subidas y concatenadas correctamente para el día $fecha.",
            'dia_id' => $diaId,
            'pdf_concatenado' => $concatResult['pdf_concatenado'],
            'total_archivos' => $concatResult['total_archivos']
        ]);

    } catch (Exception $e) {
        if (isset($pdo) && $pdo->inTransaction()) {
            $pdo->rollBack();
        }
        http_response_code(500);
        echo json_encode(['success' => false, 'error' => $e->getMessage()]);
    }
}

/**
 * Función para concatenar todos los PDFs de un día
 */
function concatenarPDFs($diaId, $fecha, $pdo) {
    $uploadDir = __DIR__ . '/../';
    $concatDir = __DIR__ . '/../uploads/concatenados/';

    // Obtener todos los archivos del día
    $stmtFiles = $pdo->prepare("SELECT ruta_archivo FROM factura_archivos_pdf WHERE dia_id = :dia_id ORDER BY orden ASC, id ASC");
    $stmtFiles->execute([':dia_id' => $diaId]);
    $files = $stmtFiles->fetchAll();

    $totalFiles = count($files);
    if ($totalFiles === 0) {
        // Si no hay archivos, limpiar el concatenado
        $stmtUpdate = $pdo->prepare("UPDATE factura_dias_pdf SET pdf_concatenado = NULL, total_archivos = 0 WHERE id = :id");
        $stmtUpdate->execute([':id' => $diaId]);
        return ['pdf_concatenado' => null, 'total_archivos' => 0];
    }

    // Crear PDF concatenado con FPDI
    $pdf = new Fpdi();
    
    // Desactivar cabeceras y pies por defecto de TCPDF
    $pdf->setPrintHeader(false);
    $pdf->setPrintFooter(false);

    foreach ($files as $f) {
        $filePath = $uploadDir . $f['ruta_archivo'];
        if (!file_exists($filePath)) {
            continue;
        }

        try {
            $pageCount = $pdf->setSourceFile($filePath);
            for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
                $templateId = $pdf->importPage($pageNo);
                $size = $pdf->getTemplateSize($templateId);
                $pdf->AddPage($size['orientation'], [$size['width'], $size['height']]);
                $pdf->useTemplate($templateId);
            }
        } catch (Exception $ex) {
            // Ignorar archivos corruptos o encriptados pero continuar
        }
    }

    $concatName = 'facturas_' . str_replace('-', '_', $fecha) . '.pdf';
    $concatPath = $concatDir . $concatName;
    $pdf->Output($concatPath, 'F');

    // Actualizar base de datos
    $dbPath = 'uploads/concatenados/' . $concatName;
    $stmtUpdate = $pdo->prepare("
        UPDATE factura_dias_pdf 
        SET pdf_concatenado = :pdf, total_archivos = :total 
        WHERE id = :id
    ");
    $stmtUpdate->execute([
        ':pdf'   => $dbPath,
        ':total' => $totalFiles,
        ':id'    => $diaId
    ]);

    return ['pdf_concatenado' => $dbPath, 'total_archivos' => $totalFiles];
}
