<?php
session_start();
require_once '../includes/db.php';

if (!isset($_SESSION['usuario_id']) || $_SESSION['rol'] !== 'admin') {
    header('Location: login.php');
    exit;
}

// Verificar que tenemos los datos necesarios
if (!isset($_POST['venta_id']) || !isset($_POST['cliente_id'])) {
    $_SESSION['mensaje_error'] = "Faltan datos necesarios para generar la factura";
    header('Location: facturar.php');
    exit;
}

$db = new Database();
$pdo = $db->getPDO();

// Obtener datos del cliente
$stmt = $pdo->prepare("SELECT * FROM clientes WHERE id_cliente = ?");
$stmt->execute([$_POST['cliente_id']]);
$cliente = $stmt->fetch(PDO::FETCH_ASSOC);

// Obtener items de la venta
$sql = "SELECT p.codigo, p.titulo, p.iva,
               vi.cantidad, vi.precio_unitario, vi.subtotal
        FROM venta_items vi 
        INNER JOIN productos p ON vi.producto_id = p.id
        WHERE vi.venta_id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$_POST['venta_id']]);
$items = $stmt->fetchAll(PDO::FETCH_ASSOC);

// No necesitamos los datos de configuración para este formato simplificado

?>
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Factura PDF</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
    <style>
        body {
            font-family: 'Lucida Console', Monaco, monospace;
            padding: 20px;
        }
        pre {
            background: white;
            padding: 40px 20px 20px 20px;
            margin: 0 auto;
            font-size: 10px;
            line-height: 0.9;
            letter-spacing: -0.1px;
            font-family: 'Lucida Console', Monaco, monospace;
        }
        .controls {
            position: fixed;
            top: 20px;
            right: 20px;
            background: white;
            padding: 10px;
            border: 1px solid #ccc;
            z-index: 1000;
        }
        button {
            padding: 10px 20px;
            cursor: pointer;
            margin: 0 5px;
            border: none;
            border-radius: 4px;
            font-weight: bold;
            transition: all 0.3s ease;
            text-transform: uppercase;
            font-size: 14px;
        }
        button:hover {
            transform: translateY(-2px);
            box-shadow: 0 2px 5px rgba(0,0,0,0.2);
        }
        .btn-primary {
            background-color: #007bff;
            color: white;
        }
        .btn-primary:hover {
            background-color: #0056b3;
        }
        .btn-secondary {
            background-color: #6c757d;
            color: white;
        }
        .btn-secondary:hover {
            background-color: #545b62;
        }
    </style>
</head>
<body>
<div class="controls">
    <button class="btn-primary" onclick="generarPDF()">Descargar PDF</button>
    <button class="btn-secondary" onclick="window.location.href='facturar.php'">Volver</button>
</div>

<pre id="factura"><?php
    // Preparar los datos
    $nombreCliente = $cliente['razon_social'] ?: ($cliente['nombre'] . ' ' . $cliente['apellidos']);
    $rucCliente = $cliente['numero_documento'];
    $direccionCliente = $cliente['direccion'] ?: 'NO ESPECIFICADA';
    
    // Calcular totales
    $total = 0;
    foreach ($items as $item) {
        $total += $item['subtotal'];
    }
    $iva10 = round($total / 11, 2);

    // Generar contenido de la factura
    $contenido = sprintf("Fecha: %s - Condición de venta: %s\n",
        date('d-M-Y, H:i:s'),
        ($_POST['condicion_tipo'] == '2' ? 'CRÉDITO' : 'CONTADO')
    );
    
    $contenido .= "Razón Social: {$nombreCliente} - RUC: {$rucCliente}\n";
    $contenido .= "Dirección: {$direccionCliente} - Núm Int: " . date('ymdHis') . "\n";
    $contenido .= "---------------------------------------------------------------------------------------------------\n";
    $contenido .= "|CODIGO       |CANT |ARTICULOS O SERVICIOS                               |IVA|    PRECIO|     MONTO|\n";
    $contenido .= "---------------------------------------------------------------------------------------------------\n";

    // Función para eliminar acentos
    function eliminarAcentos($cadena) {
        $cadena = preg_replace('/[áàãâä]/ui', 'a', $cadena);
        $cadena = preg_replace('/[éèêë]/ui', 'E', $cadena);
        $cadena = preg_replace('/[íìîï]/ui', 'i', $cadena);
        $cadena = preg_replace('/[óòõôö]/ui', 'o', $cadena);
        $cadena = preg_replace('/[úùûü]/ui', 'u', $cadena);
        $cadena = preg_replace('/[ñ]/ui', 'n', $cadena);
        $cadena = preg_replace('/[^a-z0-9 ]/i', '', $cadena);
        return $cadena;
    }

    // Agregar items
    foreach ($items as $item) {
        $codigo = str_pad(trim($item['codigo']), 13, ' ');
        $cantidad = str_pad($item['cantidad'], 4, ' ', STR_PAD_LEFT) . ' ';
        $descripcion = str_pad(substr(eliminarAcentos(strtoupper(trim($item['titulo']))), 0, 49), 49, ' ') . '   ';
        $precio = str_pad(number_format($item['precio_unitario'], 0, '.', ','), 10, ' ', STR_PAD_LEFT);
        $monto = str_pad(number_format($item['subtotal'], 0, '.', ','), 10, ' ', STR_PAD_LEFT);
        
        $contenido .= "|{$codigo}|{$cantidad}|{$descripcion}|10%|{$precio}|{$monto}|\n";
    }

    // Rellenar líneas vacías
    for ($i = count($items); $i < 15; $i++) {
        $contenido .= "|" . str_pad('', 13, ' ') . "|" . str_pad('', 5, ' ') . "|" . 
                     str_pad('', 52, ' ') . "|   |" . str_pad('', 10, ' ') . "|" . 
                     str_pad('', 10, ' ') . "|\n";
    }

    $contenido .= "---------------------------------------------------------------------------------------------------\n";
    $contenido .= "Subtotales 0%: 0. - 5%: 0. - 10%: " . number_format($total, 0, '.', ',') . ".\n";
    $contenido .= "Liquidación del IVA: 5%: 0. - 10%: " . number_format($iva10, 0, '.', ',') . " - Total IVA: " . number_format($iva10, 0, '.', ',') . "\n";
    $contenido .= "---------------------------------------------------------------------------------------------------\n\n";
    $contenido .= str_pad("TOTAL GS " . number_format($total, 0, '.', ',') . ".", 99, ' ', STR_PAD_LEFT) . "\n";

    // Función para convertir números a palabras
    function numeroALetras($numero) {
        $parte_entera = floor($numero);
        $unidades = array('', 'UN', 'DOS', 'TRES', 'CUATRO', 'CINCO', 'SEIS', 'SIETE', 'OCHO', 'NUEVE');
        $decenas = array('', 'DIEZ', 'VEINTE', 'TREINTA', 'CUARENTA', 'CINCUENTA', 'SESENTA', 'SETENTA', 'OCHENTA', 'NOVENTA');
        $centenas = array('', 'CIENTO', 'DOSCIENTOS', 'TRESCIENTOS', 'CUATROCIENTOS', 'QUINIENTOS', 'SEISCIENTOS', 'SETECIENTOS', 'OCHOCIENTOS', 'NOVECIENTOS');
        $diezes = array('DIEZ', 'ONCE', 'DOCE', 'TRECE', 'CATORCE', 'QUINCE', 'DIECISEIS', 'DIECISIETE', 'DIECIOCHO', 'DIECINUEVE');

        if ($parte_entera == 0) return 'CERO';
        $texto = '';

        // Procesamos los miles de millones
        $miles_millones = floor($parte_entera / 1000000000);
        if ($miles_millones > 0) {
            if ($miles_millones == 1) $texto .= 'MIL ';
            else $texto .= numeroALetras($miles_millones) . ' MIL ';
            $parte_entera %= 1000000000;
        }

        // Procesamos los millones
        $millones = floor($parte_entera / 1000000);
        if ($millones > 0) {
            if ($millones == 1) $texto .= 'UN MILLON ';
            else $texto .= numeroALetras($millones) . ' MILLONES ';
            $parte_entera %= 1000000;
        }
        
        // Procesamos los miles
        $miles = floor($parte_entera / 1000);
        if ($miles > 0) {
            if ($miles == 1) $texto .= 'MIL ';
            else $texto .= numeroALetras($miles) . ' MIL ';
            $parte_entera %= 1000;
        }
        
        // Procesamos las centenas
        $centena = floor($parte_entera / 100);
        if ($centena > 0) {
            if ($centena == 1 && $parte_entera % 100 == 0) $texto .= 'CIEN ';
            else $texto .= $centenas[$centena] . ' ';
            $parte_entera %= 100;
        }
        
        // Procesamos las decenas
        $decena = floor($parte_entera / 10);
        if ($decena > 0) {
            if ($decena == 1 && $parte_entera % 10 > 0) {
                $texto .= $diezes[$parte_entera % 10] . ' ';
                $parte_entera = 0;
            } else {
                $texto .= $decenas[$decena];
                if ($parte_entera % 10 > 0) $texto .= ' Y ';
            }
            $parte_entera %= 10;
        }
        
        // Procesamos las unidades
        if ($parte_entera > 0) {
            $texto .= $unidades[$parte_entera] . ' ';
        }
        
        return trim($texto);
    }

    $contenido .= str_pad(numeroALetras($total) . " ", 99, ' ', STR_PAD_LEFT) . "\n";
    $contenido .= "---------------------------------------------------------------------------------------------------\n";
    $contenido .= "¡Gracias por su compra!";
    
    // Duplicar el contenido con espacio entre copias
    $espacioEntreCopias = str_repeat("\n", 19);
    echo $contenido . $espacioEntreCopias . $contenido;
?></pre>

<script>
    window.jsPDF = window.jspdf.jsPDF;

    function generarPDF() {
        var pdf = new jsPDF({
            orientation: 'portrait',
            unit: 'mm',
            format: 'a4'
        });

        // Configurar fuente monoespaciada bold para mejor legibilidad
        pdf.setFont('Courier', 'bold');
        pdf.setFontSize(9); // Tamaño 9 pero en negrita

        // Obtener el contenido del pre
        const contenido = document.getElementById('factura');
        const lineas = contenido.innerText.split('\n');

        // Variables para posicionamiento
        let y = 45; // Aumentado el margen superior
        const margenX = 15; // Aumentado el margen izquierdo
        
        // Procesar cada línea
        lineas.forEach((linea) => {
            // Si llegamos al final de la página, crear nueva página
            if (y > 280) {
                pdf.addPage();
                y = 15;
            }
            
            // Agregar la línea al PDF
            if (linea.trim() !== '') {
                pdf.text(margenX, y, linea);
            }
            y += 3; // Espacio más reducido para fuente de 9pt
        });

        // Guardar el PDF
        pdf.save('factura-' + new Date().getTime() + '.pdf');
    }
</script>

<script>
    // Este código ya no es necesario porque la factura se genera en PHP
    const empresa = {};
        'razonSocial' => $cliente['razon_social'] ?: ($cliente['nombre'] . ' ' . $cliente['apellidos']),
        'ruc' => $cliente['numero_documento'],
        'direccion' => $cliente['direccion'] ?: 'NO ESPECIFICADA'
    ]); ?>;
    
    // Datos de los artículos
    const articulos = <?php echo json_encode(array_map(function($item) {
        return [
            'codigo' => $item['codigo'],
            'descripcion' => $item['titulo'],
            'cantidad' => intval($item['cantidad']),
            'precio' => intval($item['precio_unitario']),
            'monto' => intval($item['subtotal'])
        ];
    }, $items)); ?>;

    function obtenerFechaHora() {
        const now = new Date();
        const dd = String(now.getDate()).padStart(2,'0');
        const mm = String(now.getMonth()+1).padStart(2,'0');
        const yyyy = now.getFullYear();
        const hh = String(now.getHours()).padStart(2,'0');
        const min = String(now.getMinutes()).padStart(2,'0');
        const ss = String(now.getSeconds()).padStart(2,'0');
        return `${dd}-${mm}-${yyyy} ${hh}:${min}:${ss}`;
    }

    function generarNumInt() {
        const now = new Date();
        const yy = String(now.getFullYear()).slice(-2);
        const mm = String(now.getMonth()+1).padStart(2,'0');
        const dd = String(now.getDate()).padStart(2,'0');
        const hh = String(now.getHours()).padStart(2,'0');
        const min = String(now.getMinutes()).padStart(2,'0');
        const ss = String(now.getSeconds()).padStart(2,'0');
        return yy + mm + dd + hh + min + ss;
    }

    // Función para renderizar la factura
    function renderFactura() {
        let total = 0;
        let articulosHTML = '';

        // Calcular el ancho total disponible y el padding necesario
        const anchoTotal = 99; // Ancho total de la línea

        // Header de la empresa
        const headerEmpresa = 
`${empresa.nombre}
${empresa.direccion}
${empresa.ciudad}
Tel.: ${empresa.telefono}
RUC: ${empresa.ruc}

`;

        articulos.forEach(art => {
            const codigoPadded = art.codigo.toString().padEnd(13, ' ');
            const cantidadPadded = art.cantidad.toString().padStart(5, ' ');
            const descripcionPadded = art.descripcion.padEnd(51, ' ');
            const precioPadded = art.precio.toString().padStart(10, ' ');
            const montoPadded = art.monto.toString().padStart(10, ' ');

            articulosHTML += `|${codigoPadded}|${cantidadPadded}|${descripcionPadded}|10%|${precioPadded}|${montoPadded}|\n`;
            total += art.monto;
        });

        // Renglones vacíos para completar 15 líneas
        for(let i = articulos.length; i < 15; i++) {
            articulosHTML += `|${' '.repeat(13)}|${' '.repeat(5)}|${' '.repeat(51)}|   |${' '.repeat(10)}|${' '.repeat(10)}|\n`;
        }

        const iva10 = Math.round(total / 11);
        const totalLiteral = numeroALetras(total);

        const facturaHTML = 
`${headerEmpresa}
FACTURA VENTA
--------------------------------------------------------------------------------------------------
Fecha: ${obtenerFechaHora()} - Condición de venta: ${document.getElementById('condicion_tipo').value === '2' ? 'CRÉDITO' : 'CONTADO'}
Razón Social: ${cliente.razonSocial} - RUC: ${cliente.ruc}
Dirección: ${cliente.direccion} - Núm Int: ${generarNumInt()}
---------------------------------------------------------------------------------------------------
|CODIGO       |CANT |ARTICULOS O SERVICIOS                              |IVA|    PRECIO|     MONTO|
---------------------------------------------------------------------------------------------------
${articulosHTML}---------------------------------------------------------------------------------------------------
Subtotales 0%: 0 - 5%: 0 - 10%: ${total}
Liquidación del IVA: 5%: 0 - 10%: ${iva10} - Total IVA: ${iva10}
---------------------------------------------------------------------------------------------------

                                                                                  TOTAL GS ${total}
${totalLiteral.toUpperCase()}
---------------------------------------------------------------------------------------------------
¡Gracias por su compra!`;

        // Agregar espacio para el duplicado
        const espacioDuplicado = '\n'.repeat(20);
        document.getElementById('contenidoFactura').textContent = facturaHTML + espacioDuplicado + facturaHTML;
    }

    async function generarPDF() {
        const element = document.getElementById('factura');
        
        // Configurar opciones de html2canvas
        const canvas = await html2canvas(element, {
            scale: 2,
            logging: false,
            useCORS: true,
            allowTaint: true,
            backgroundColor: "#ffffff",
            letterRendering: true,
            windowWidth: element.scrollWidth,
            windowHeight: element.scrollHeight
        });
        
        const imgData = canvas.toDataURL('image/png');

        // Configurar PDF en tamaño A4
        const pdf = new jspdf.jsPDF({
            orientation: "portrait",
            unit: "mm",
            format: "a4"
        });

        const pageWidth = pdf.internal.pageSize.getWidth();
        const pageHeight = pdf.internal.pageSize.getHeight();

        // Calcular dimensiones manteniendo proporción
        const imgProps = pdf.getImageProperties(imgData);
        const pdfWidth = pageWidth - 20; // 10mm de margen a cada lado
        const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width;

        // Agregar la imagen al PDF con márgenes
        pdf.addImage(imgData, "PNG", 10, 10, pdfWidth, pdfHeight);
    }

    // Número a letras (función que proporcionaste)
    function numeroALetras(num) {
        // ... (mantener la función completa que proporcionaste)
    }

    window.jsPDF = window.jspdf.jsPDF;
    
</script>

</body>
</html>
