<?php
error_reporting(E_ALL ^ E_NOTICE);

include_once '../conexion.php';
include_once '../clases/TokenValidator.php';
require_once '../tcpdf/tcpdf.php';

$usuarioId = TokenValidator::validar($conn);

$bodyRequest = file_get_contents("php://input");
$datos = json_decode($bodyRequest, true);

if (json_last_error() !== JSON_ERROR_NONE) {
    header("Content-Type: application/json; charset=utf-8");
    echo json_encode(["estado" => 0, "mensaje" => "JSON inválido: " . json_last_error_msg()], JSON_UNESCAPED_UNICODE);
    exit;
}

$ventaId = $datos[0] ?? 0;
$cab = $datos[1] ?? [];

function txt($v) {
    return trim((string)($v ?? ''));
}

function num2($v) {
    $v = str_replace([',', 'S/.', 'S/', '$', ' '], '', (string)($v ?? '0'));
    if ($v === '') $v = '0';
    return number_format((float)$v, 2, '.', '');
}

function cantidadTicket($v) {
    $n = (float)($v ?? 0);
    if (floor($n) == $n) return number_format($n, 0, '.', '');
    return rtrim(rtrim(number_format($n, 3, '.', ''), '0'), '.');
}

try {
    $stmt = $conn->prepare("SELECT obtener_detalle_venta(:venta_id) AS resultado");
    $stmt->bindParam(":venta_id", $ventaId, PDO::PARAM_INT);
    $stmt->execute();

    $row = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$row || empty($row["resultado"])) {
        header("Content-Type: application/json; charset=utf-8");
        echo json_encode(["estado" => 0, "mensaje" => "No se encontró detalle de venta."], JSON_UNESCAPED_UNICODE);
        exit;
    }

    $data = json_decode($row["resultado"], true);
    $detalle = $data["detventas"] ?? [];

    if (empty($detalle)) {
        header("Content-Type: application/json; charset=utf-8");
        echo json_encode(["estado" => 0, "mensaje" => "El documento no tiene detalle."], JSON_UNESCAPED_UNICODE);
        exit;
    }

    $itemsPorPagina = 15;
    $bloques = array_chunk($detalle, $itemsPorPagina);

    $pdf = new TCPDF('P', 'mm', [80, 360], true, 'UTF-8', false);
    $pdf->setPageUnit('mm');
    $pdf->SetMargins(1.5, 3, 1.5);
    $pdf->SetAutoPageBreak(false, 3);
    $pdf->SetCellPadding(0);
    $pdf->setPrintHeader(false);
    $pdf->setPrintFooter(false);

    $totalPaginas = count($bloques);
    $incluyeIgv = $cab["incluye_igv"] ?? "1";
    $moneda = txt($cab["simbolo_moneda"] ?? "S/.");

    foreach ($bloques as $idx => $items) {
        $pdf->AddPage();

        // CABECERA
        $pdf->SetFont('dejavusanscondensed', 'B', 10.2);
        $pdf->MultiCell(0, 4.2, txt($cab["razon_social_empresa"] ?? ""), 0, 'C');

        $pdf->SetFont('dejavusanscondensed', 'B', 9.0);
        $pdf->Cell(0, 4, "RUC : " . txt($cab["ruc_empresa"] ?? ""), 0, 1, 'C');

        $pdf->Ln(0.6);

        $pdf->SetFont('dejavusanscondensed', 'B', 8.2);
        $pdf->MultiCell(0, 3.7, txt($cab["rubro"] ?? ""), 0, 'C');
        $pdf->MultiCell(0, 3.7, txt($cab["direccion_empresa"] ?? ""), 0, 'C');

        if (!empty($cab["telefono"]) || !empty($cab["correo"])) {
            $pdf->SetFont('dejavusanscondensed', 'B', 7.2);
            $pdf->MultiCell(0, 3.2, txt($cab["telefono"] ?? "") . " " . txt($cab["correo"] ?? ""), 0, 'C');
        }

        $pdf->Ln(1.2);

        $pdf->SetFont('dejavusanscondensed', 'B', 11.2);
        $pdf->Cell(0, 5, txt($cab["tipo_documento"] ?? "DOCUMENTO"), 0, 1, 'C');

        $pdf->SetFont('dejavusanscondensed', 'B', 10.2);
        $pdf->Cell(0, 5, txt($cab["numero_comprobante"] ?? ""), 0, 1, 'C');

        $pdf->Ln(0.8);

        // CLIENTE
        $pdf->Line(1.5, $pdf->GetY(), 78.5, $pdf->GetY());
        $pdf->Ln(1);

        $pdf->SetFont('dejavusanscondensed', 'B', 8.4);
        $pdf->Cell(25, 3.8, "FECHA:", 0, 0, 'L');
        $pdf->Cell(25, 3.8, txt($cab["fecha_emision"] ?? ""), 0, 0, 'L');
        $pdf->Cell(12, 3.8, "HORA:", 0, 0, 'L');
        $pdf->Cell(15, 3.8, txt($cab["hora_emision"] ?? ""), 0, 1, 'L');

        if (!empty($cab["fecha_vencimiento"])) {
            $pdf->Cell(25, 3.8, "F. VCTO:", 0, 0, 'L');
            $pdf->Cell(52, 3.8, txt($cab["fecha_vencimiento"]), 0, 1, 'L');
        }

        $pdf->Cell(25, 3.8, "CLIENTE:", 0, 0, 'L');
        $pdf->MultiCell(52, 3.8, txt($cab["cliente"] ?? ""), 0, 'L');

        $pdf->Cell(25, 3.8, "RUC/DNI:", 0, 0, 'L');
        $pdf->Cell(52, 3.8, txt($cab["ruc_cliente"] ?? ""), 0, 1, 'L');

        $pdf->Cell(25, 3.8, "DIRECCION:", 0, 0, 'L');
        $pdf->MultiCell(52, 3.8, txt($cab["direccion_cliente"] ?? ""), 0, 'L');

        $pdf->Cell(25, 3.8, "CONDICION:", 0, 0, 'L');
        $pdf->Cell(52, 3.8, txt($cab["condicion_pago"] ?? ""), 0, 1, 'L');

        if (!empty($cab["guia_remision"])) {
            $pdf->Cell(25, 3.8, "GUIA REM.:", 0, 0, 'L');
            $pdf->Cell(52, 3.8, txt($cab["guia_remision"]), 0, 1, 'L');
        }

        $pdf->Ln(1);
        $pdf->Line(1.5, $pdf->GetY(), 78.5, $pdf->GetY());
        $pdf->Ln(1);

        // CABECERA DETALLE
        $pdf->SetFont('dejavusanscondensed', 'B', 9.0);
        $pdf->Cell(12, 4.2, "CANT.", 0, 0, 'C');
        $pdf->Cell(43, 4.2, "DESCRIPCION", 0, 0, 'L');
        $pdf->Cell(10, 4.2, "P.UNIT", 0, 0, 'R');
        $pdf->Cell(12, 4.2, "TOTAL", 0, 1, 'R');

        $pdf->Line(1.5, $pdf->GetY(), 78.5, $pdf->GetY());
        $pdf->Ln(1.2);

        // DETALLE
        $yInicioDetalle = $pdf->GetY();

        foreach ($items as $it) {
            $cantidad = cantidadTicket($it["cantidad"] ?? 0);
            $unidad = txt($it["descrip_precio"] ?? "");
            $desc = txt($it["nomproducto"] ?? "");

            $precio = ($incluyeIgv == "1" || $incluyeIgv === true || $incluyeIgv == "true")
                ? ($it["precioigv"] ?? 0)
                : ($it["precio"] ?? 0);

            $total = ($incluyeIgv == "1" || $incluyeIgv === true || $incluyeIgv == "true")
                ? ($it["subtotaligv"] ?? 0)
                : ($it["subtotal"] ?? 0);

            $yIni = $pdf->GetY();
            $xIni = $pdf->GetX();

            $pdf->SetFont('dejavusanscondensed', 'B', 9.0);
            $pdf->MultiCell(12, 5.0, $cantidad . "\n" . $unidad, 0, 'C', false, 0, $xIni, $yIni);

            $xDesc = $xIni + 13;
            $pdf->SetXY($xDesc, $yIni);
            $pdf->SetFont('dejavusanscondensed', 'B', 9.0);
            $pdf->MultiCell(42, 4.8, $desc, 0, 'L');

            $altoDesc = $pdf->GetY() - $yIni;

            $pdf->SetXY($xIni + 55, $yIni);
            $pdf->SetFont('dejavusanscondensed', 'B', 9.0);
            $pdf->Cell(10, 4.8, num2($precio), 0, 0, 'R');
            $pdf->Cell(12, 4.8, num2($total), 0, 1, 'R');

            $alto = max($altoDesc, 10);
            $pdf->SetY($yIni + $alto + 1.2);
        }

        $altoFilaFija = 10.0;
        $yMinimoTotales = $yInicioDetalle + (16 * $altoFilaFija);
        $yMaximoTotales = 250;

        if ($yMinimoTotales > $yMaximoTotales) {
            $yMinimoTotales = $yMaximoTotales;
        }

        if ($pdf->GetY() < $yMinimoTotales) {
            $pdf->SetY($yMinimoTotales);
        }

        // TOTALES
        $pdf->Ln(1);
        $pdf->Line(1.5, $pdf->GetY(), 78.5, $pdf->GetY());
        $pdf->Ln(1.2);

        $totalDocumento = num2($cab["total_pagar"] ?? $cab["total_a_pagar"] ?? $cab["total"] ?? 0);

        $pdf->SetFont('dejavusanscondensed', 'B', 9.0);

        $pdf->Cell(48, 4.0, "OP. GRAVADA:", 0, 0, 'R');
        $pdf->Cell(29, 4.0, $moneda . " " . num2($cab["sub_total"] ?? 0), 0, 1, 'R');

        $pdf->Cell(48, 4.0, "EXONERADA:", 0, 0, 'R');
        $pdf->Cell(29, 4.0, $moneda . " " . num2($cab["exonerada"] ?? 0), 0, 1, 'R');

        $pdf->Cell(48, 4.0, "DESCUENTO:", 0, 0, 'R');
        $pdf->Cell(29, 4.0, $moneda . " " . num2($cab["descuento"] ?? 0), 0, 1, 'R');

        $pdf->Cell(48, 4.0, "ICBPER:", 0, 0, 'R');
        $pdf->Cell(29, 4.0, $moneda . " " . num2($cab["icbper"] ?? 0), 0, 1, 'R');

        $pdf->Cell(48, 4.0, "IGV:", 0, 0, 'R');
        $pdf->Cell(29, 4.0, $moneda . " " . num2($cab["igv"] ?? 0), 0, 1, 'R');

        $pdf->Cell(48, 4.0, "TOTAL:", 0, 0, 'R');
        $pdf->Cell(29, 4.0, $moneda . " " . num2($cab["total"] ?? $totalDocumento), 0, 1, 'R');

        $pdf->Cell(48, 4.0, "A CUENTA:", 0, 0, 'R');
        $pdf->Cell(29, 4.0, $moneda . " " . num2($cab["acuenta"] ?? 0), 0, 1, 'R');

        $pdf->SetFont('dejavusanscondensed', 'B', 10.8);
        $pdf->Cell(48, 5.0, "TOTAL A PAGAR:", 0, 0, 'R');
        $pdf->Cell(29, 5.0, $moneda . " " . $totalDocumento, 0, 1, 'R');

        $pdf->Ln(1.5);

        // PIE
        $pdf->SetFont('dejavusanscondensed', 'B', 8.6);
        $pdf->MultiCell(0, 4.0, "SON: " . txt($cab["total_letras"] ?? ""), 0, 'L');

        $pdf->SetFont('dejavusanscondensed', 'B', 8.4);
        $pdf->Cell(0, 3.8, "CONDICION: " . txt($cab["condicion_pago"] ?? ""), 0, 1, 'L');
        $pdf->Cell(0, 3.8, "VENDEDOR: " . txt($cab["vendedor"] ?? ""), 0, 1, 'L');

        if (!empty($cab["observaciones"])) {
            $pdf->MultiCell(0, 3.8, "OBS.: " . txt($cab["observaciones"]), 0, 'L');
        }

        if (!empty($cab["cuotas_credito"])) {
            $pdf->Ln(0.8);
            $pdf->SetFont('dejavusanscondensed', 'B', 7.8);
            $pdf->MultiCell(0, 3.6, "CUOTAS:\n" . txt($cab["cuotas_credito"]), 0, 'L');
        }

        $hash = txt($cab["hash"] ?? "");
        if ($hash !== "" && stripos($hash, "jLabel") !== 0) {
            $pdf->SetFont('dejavusanscondensed', 'B', 6.8);
            $pdf->MultiCell(0, 3.2, "Hash: " . $hash, 0, 'L');
        }

        $qr = txt($cab["qr"] ?? "");
        $tipoDoc = strtoupper(txt($cab["tipo_documento"] ?? ""));

        if (!empty($qr) && ($tipoDoc == "FACTURA ELECTRONICA" || $tipoDoc == "BOLETA ELECTRONICA")) {
            $pdf->Ln(1.2);
            $xQr = 31;
            $yQr = $pdf->GetY();

            if ($yQr < 315) {
                $pdf->write2DBarcode($qr, 'QRCODE,L', $xQr, $yQr, 18, 18, [], 'N');
                $pdf->SetY($yQr + 19);
            }
        } else {
            $pdf->Ln(1.2);
        }

        $pdf->Ln(0.5);

        $pdf->SetFont('dejavusanscondensed', 'B', 7.8);
        $pdf->Cell(0, 3.8, "Página " . ($idx + 1) . " de " . $totalPaginas, 0, 1, 'C');

        $pdf->Ln(1.2);

        $pdf->SetFont('dejavusanscondensed', 'B', 9.0);
        $pdf->Cell(0, 4.2, "¡ GRACIAS POR SU PREFERENCIA !", 0, 1, 'C');

        $pdf->Ln(0.8);

        $pdf->SetFont('dejavusanscondensed', 'B', 7.0);
        $pdf->Cell(0, 3.3, "BIENES Y SERVICIOS TRANSFERIDOS EN LA AMAZONIA", 0, 1, 'C');
        $pdf->Cell(0, 3.3, "REGION SELVA PARA SER CONSUMIDOS EN LA MISMA", 0, 1, 'C');
    }

    $carpeta = __DIR__ . "/../pdf_temp/";

    if (!file_exists($carpeta)) {
        mkdir($carpeta, 0777, true);
    }

    $nombrePdf = "ticket_" . $ventaId . "_" . time() . ".pdf";
    $rutaFisica = $carpeta . $nombrePdf;

    $pdf->Output($rutaFisica, "F");

    $urlPdf = "http://distbejarano.sicsemkj.com/api_comercial/pdf_temp/" . $nombrePdf;

    header("Content-Type: application/json; charset=utf-8");
    echo json_encode([
        "estado" => 1,
        "url" => $urlPdf
    ], JSON_UNESCAPED_UNICODE);
    exit;

} catch (Exception $e) {
    header("Content-Type: application/json; charset=utf-8");
    echo json_encode([
        "estado" => 0,
        "mensaje" => "Error al generar PDF: " . $e->getMessage()
    ], JSON_UNESCAPED_UNICODE);
    exit;
}