<?php
session_start();
if(empty($_SESSION['carrito'])) {
    header('Location: carrito.php');
    exit;
}

if($_SERVER['REQUEST_METHOD'] !== 'POST' || empty($_POST['nombre_cliente'])) {
    header('Location: form_presupuesto.php');
    exit;
}

// Sanitizar las observaciones
$observaciones = isset($_POST['observacion']) ? trim($_POST['observacion']) : '';

require_once 'includes/db.php';
require_once('tcpdf/tcpdf.php');

$db = new Database();
$configQuery = $db->query("SELECT * FROM configuracion")->fetch(PDO::FETCH_ASSOC);

// Crear nuevo documento PDF
$pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);

// Establecer información del documento
$pdf->SetCreator('JKEAS');
$pdf->SetAuthor('JKEAS');
$pdf->SetTitle('Presupuesto');

// Remover encabezado y pie de página
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);

// Agregar una página
$pdf->AddPage();

// Establecer fuente
$pdf->SetFont('helvetica', '', 12);

// Logo y membrete
if (isset($configQuery['logo']) && file_exists('uploads/config/' . $configQuery['logo'])) {
    $pdf->Image('uploads/config/' . $configQuery['logo'], 15, 15, 15); // Logo más pequeño (15mm)
}

// Datos del comercio
$pdf->SetY(15);
$pdf->SetX(40); // Dejamos espacio para el logo
$pdf->SetFont('helvetica', 'B', 12);
$pdf->Cell(0, 10, $configQuery['nombre_comercio'], 0, 1, 'L');

$pdf->SetX(40);
$pdf->SetFont('helvetica', '', 10);
$pdf->Cell(0, 5, $configQuery['direccion'], 0, 1, 'L');
$pdf->SetX(40);
$pdf->Cell(0, 5, 'Tel: ' . $configQuery['telefono'], 0, 1, 'L');

$pdf->Ln(5);
$pdf->SetFont('helvetica', 'B', 16); // Tamaño reducido del título
$pdf->Cell(0, 15, 'PRESUPUESTO', 0, 1, 'C');

// Información del cliente
$pdf->SetFont('helvetica', '', 11);
$pdf->Cell(0, 5, 'Fecha: ' . date('d/m/Y'), 0, 1, 'R');
$pdf->Ln(5);

// Texto dirigido al cliente
$pdf->SetFont('helvetica', '', 11);
$nombreCliente = htmlspecialchars($_POST['nombre_cliente']);
$pdf->Cell(0, 7, 'Estimado/a ' . $nombreCliente . ':', 0, 1, 'L');
$pdf->MultiCell(0, 7, 'Nos complace presentarle el siguiente presupuesto detallado de acuerdo a su solicitud. Quedamos a su disposición para cualquier consulta adicional.', 0, 'L');
$pdf->Ln(5);

// Cabecera de la tabla
$pdf->SetFillColor(240, 240, 240);
$pdf->SetFont('helvetica', 'B', 11);
$pdf->Cell(25, 10, 'Imagen', 1, 0, 'C', true);
$pdf->Cell(15, 10, 'Cant.', 1, 0, 'C', true);
$pdf->Cell(90, 10, 'Descripción', 1, 0, 'C', true);
$pdf->Cell(30, 10, 'Precio Unit.', 1, 0, 'C', true);
$pdf->Cell(30, 10, 'Subtotal', 1, 1, 'C', true);

// Contenido de la tabla
$pdf->SetFont('helvetica', '', 10);
$total = 0;

if (!empty($_SESSION['carrito'])) {
    $ids = array_keys($_SESSION['carrito']);
    $placeholders = str_repeat('?,', count($ids) - 1) . '?';
    $productos = $db->query("
        SELECT p.* FROM productos p
        WHERE p.id IN ($placeholders)
    ", $ids)->fetchAll(PDO::FETCH_ASSOC);

    foreach ($productos as $producto) {
        $cantidad = $_SESSION['carrito'][$producto['id']]['cantidad'];
        
        // Determinar precio a usar: oferta si existe, sino precio seleccionado
        $precio = 0;
        if (isset($_SESSION['carrito'][$producto['id']]['tiene_oferta']) && 
            $_SESSION['carrito'][$producto['id']]['tiene_oferta'] && 
            isset($_SESSION['carrito'][$producto['id']]['precio_oferta'])) {
            $precio = $_SESSION['carrito'][$producto['id']]['precio_oferta'];
        } else {
            $precioSeleccionado = $_SESSION['carrito'][$producto['id']]['precio_seleccionado'] ?? 'precio_venta1';
            $precio = $producto[$precioSeleccionado];
        }
        
        $subtotal = $precio * $cantidad;
        $total += $subtotal;

        // Calcular altura necesaria para la descripción
        $pdf->SetFont('helvetica', '', 10);
        $descripcion = strtoupper(trim($producto['titulo'])); // Convertir a mayúsculas
        
        // Agregar indicador de oferta si corresponde
        if (isset($_SESSION['carrito'][$producto['id']]['tiene_oferta']) && 
            $_SESSION['carrito'][$producto['id']]['tiene_oferta']) {
            $descripcion = "** OFERTA ** " . $descripcion;
        }
        
        // Reemplazar caracteres especiales y acentos (convirtiendo ñ a Ñ)
        $unwanted_array = array(
            'Á'=>'A', 'É'=>'E', 'Í'=>'I', 'Ó'=>'O', 'Ú'=>'U',
            'á'=>'A', 'é'=>'E', 'í'=>'I', 'ó'=>'O', 'ú'=>'U',
            'Ä'=>'A', 'Ë'=>'E', 'Ï'=>'I', 'Ö'=>'O', 'Ü'=>'U',
            'ä'=>'A', 'ë'=>'E', 'ï'=>'I', 'ö'=>'O', 'ü'=>'U',
            'ñ'=>'Ñ'
        );
        $descripcion = strtr($descripcion, $unwanted_array);
        $alturaLinea = 6; // Altura base para cada línea
        $anchoCelda = 90; // Ancho ajustado de la celda de descripción
        $numLineas = ceil($pdf->GetStringWidth($descripcion) / $anchoCelda);
        $alturaTotal = max(20, $numLineas * $alturaLinea); // Mínimo 20mm para la imagen

        // Imagen del producto
        $imagenes = json_decode($producto['imagenes'], true);
        
        // Si no hay imagen, usar el logo del sistema
        if (!empty($imagenes)) {
            $imagen = $imagenes[0];
            $imagePath = 'uploads/productos/' . $imagen;
        } else {
            $imagen = $configQuery['logo'];
            $imagePath = 'uploads/config/' . $imagen;
        }
        
        $xPos = $pdf->GetX();
        $yPos = $pdf->GetY();

        // Dibujamos la celda para la imagen
        $pdf->Cell(25, $alturaTotal, '', 1, 0, 'C');

        // Insertar imagen si existe
        if (file_exists($imagePath)) {
            
            // Obtener dimensiones de la imagen original
            $imgInfo = getimagesize($imagePath);
            if ($imgInfo !== false) {
                // Dimensiones máximas para la celda (en mm)
                $maxWidth = 20;  // Ancho máximo de la celda menos márgenes
                $maxHeight = $alturaTotal - 5;  // Alto máximo menos márgenes
                
                // Calcular proporciones
                $imgWidth = $imgInfo[0];
                $imgHeight = $imgInfo[1];
                $ratio = $imgWidth / $imgHeight;
                
                // Determinar dimensiones finales manteniendo proporción
                if ($ratio > 1) {
                    // Imagen horizontal
                    $finalWidth = $maxWidth;
                    $finalHeight = $maxWidth / $ratio;
                    if ($finalHeight > $maxHeight) {
                        $finalHeight = $maxHeight;
                        $finalWidth = $maxHeight * $ratio;
                    }
                } else {
                    // Imagen vertical
                    $finalHeight = $maxHeight;
                    $finalWidth = $maxHeight * $ratio;
                    if ($finalWidth > $maxWidth) {
                        $finalWidth = $maxWidth;
                        $finalHeight = $maxWidth / $ratio;
                    }
                }
                
                // Calcular posición para centrar
                $xOffset = $xPos + ((25 - $finalWidth) / 2);
                $yOffset = $yPos + ((20 - $finalHeight) / 2);
                
                // Insertar imagen
                $pdf->Image(
                    $imagePath,
                    $xOffset,
                    $yOffset,
                    $finalWidth,
                    $finalHeight
                );
            }
        }
        
        $pdf->Cell(15, $alturaTotal, $cantidad, 1, 0, 'C');
        
        // Celda con múltiples líneas para la descripción
        $xPos = $pdf->GetX();
        $yPos = $pdf->GetY();
        // Dibujamos primero el borde
        $pdf->Cell(90, $alturaTotal, '', 1, 0, 'L');
        
        // Calculamos el espacio vertical para centrar
        $espacioLibre = $alturaTotal - ($numLineas * $alturaLinea);
        $margenSuperior = $espacioLibre / 2;
        
        // Posicionamos el texto centrado verticalmente
        $pdf->SetXY($xPos, $yPos + $margenSuperior);
        // Luego el texto sin borde
        $pdf->MultiCell(90, $alturaLinea, $descripcion, 0, 'L');
        $pdf->SetXY($xPos + 90, $yPos);
        
        // Usar el precio seleccionado
        $pdf->Cell(30, $alturaTotal, number_format($precio, 0, ',', '.'), 1, 0, 'R');
        $pdf->Cell(30, $alturaTotal, number_format($subtotal, 0, ',', '.'), 1, 1, 'R');
    }
}

// Total
$pdf->SetFont('helvetica', 'B', 11);
$moneda = $configQuery['moneda'] ?? 'PYG.';
$pdf->Cell(160, 10, 'Total:', 1, 0, 'R', true);
$pdf->Cell(30, 10, $moneda . ' ' . number_format($total, 0, ',', '.'), 1, 1, 'R', true);

// Notas y Observaciones
$pdf->Ln(10);
$pdf->SetFont('helvetica', '', 10);
$pdf->MultiCell(0, 7, 'Este presupuesto tiene una validez de 7 días.', 0, 'L');

// Agregar observaciones si existen
if (!empty($_POST['observacion'])) {
    $pdf->Ln(3);
    $pdf->SetFont('helvetica', 'B', 10);
    $pdf->Cell(0, 7, 'Observaciones:', 0, 1, 'L');
    $pdf->SetFont('helvetica', '', 10);
    $pdf->MultiCell(0, 7, htmlspecialchars($_POST['observacion']), 0, 'L');
}

// Generar el PDF
$pdf->Output('Presupuesto_' . date('Y-m-d') . '.pdf', 'I');
