<?php
ob_start(); // Iniciar buffer de salida
session_start();

// Verificar si el usuario está logueado y tiene los permisos adecuados
if (!isset($_SESSION['usuario_id'])) {
    header('Location: ../login.php');
    exit;
}

// Verificar rol para acceso general
if (!in_array($_SESSION['rol'], ['admin', 'vendedor', 'cobrador'])) {
    header('Location: ../login.php');
    exit;
}

require_once '../includes/config.php';
require_once '../includes/db.php';
require_once '../tcpdf/tcpdf.php';

$db = new Database();
$id_cliente = isset($_GET['id']) ? (int)$_GET['id'] : 0;
// Verificar si se deben incluir las ventas canceladas
$mostrar_canceladas = isset($_GET['mostrar_canceladas']) && $_GET['mostrar_canceladas'] == '1';

// Obtener configuración
$stmt = $db->query("SELECT * FROM configuracion");
$config = $stmt->fetch(PDO::FETCH_ASSOC);

// Función para formatear montos según configuración
function formatearMonto($monto, $config) {
    return number_format($monto, $config['con_decimales'] ? 2 : 0) . ' ' . $config['moneda'];
}

try {
    // Verificar el ID del cliente
    if ($id_cliente <= 0) {
        throw new Exception("ID de cliente inválido: " . $id_cliente);
    }

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

    if (!$cliente) {
        throw new Exception("Cliente no encontrado con ID: " . $id_cliente);
    }

    // Obtener ventas únicas para este cliente
    $stmt = $db->prepare("
        SELECT DISTINCT venta_id 
        FROM cuotas 
        WHERE cliente_id = ? 
        ORDER BY venta_id");
    $stmt->execute([$id_cliente]);
    $ventas_ids = $stmt->fetchAll(PDO::FETCH_COLUMN);

    // Array para almacenar ventas con sus productos y cuotas
    $ventas = [];
    
    // Para cada venta, obtener sus productos y cuotas
    foreach ($ventas_ids as $venta_id) {
        // Obtener productos únicos de esta venta
        $stmt = $db->prepare("
            SELECT DISTINCT 
                c.producto_id,
                CASE 
                    WHEN c.producto_id = 0 THEN 'unificada'
                    ELSE 'normal'
                END as tipo_cuota,
                MAX(c.observaciones) as observaciones,
                CASE 
                    WHEN c.producto_id = 0 THEN NULL
                    ELSE p.codigo 
                END as producto_codigo,
                CASE 
                    WHEN c.producto_id = 0 THEN 'Venta Unificada'
                    ELSE p.titulo
                END as producto_nombre,
                p.titulo as orden_titulo  /* Agregamos la columna para ORDER BY */
            FROM cuotas c 
            LEFT JOIN productos p ON c.producto_id = p.id 
            WHERE c.venta_id = ? AND c.cliente_id = ?
            GROUP BY 
                c.producto_id,
                tipo_cuota,
                producto_codigo,
                producto_nombre,
                orden_titulo  /* Incluimos la columna en GROUP BY */
            ORDER BY c.producto_id = 0 DESC, orden_titulo  /* Usamos la columna agregada */
        ");
        $stmt->execute([$venta_id, $id_cliente]);
        $productos = $stmt->fetchAll(PDO::FETCH_ASSOC);
        
        // Inicializar la venta
        $ventas[$venta_id] = [
            'venta_id' => $venta_id,
            'productos' => [],
            'fecha_venta' => null, // Se actualizará con la primera cuota
            'subtotal' => 0,
            'cancelada' => true // Asumimos que está cancelada hasta que encontremos una cuota pendiente
        ];
        
        // Para cada producto en esta venta
        foreach ($productos as $producto) {
            // Modificar la sección donde se procesan los productos unificados
            if ($producto['tipo_cuota'] === 'unificada') {
                // Procesar productos unificados
                $productos_info = array_map(function($item) {
                    $parts = explode('/', trim($item));
                    return [
                        'id' => $parts[0] ?? 0,
                        'cantidad' => $parts[1] ?? 1
                    ];
                }, explode(',', $producto['observaciones']));
                
                // Preparar arrays separados para IDs y cantidades
                $ids_productos = [];
                $cantidades = [];
                
                foreach ($productos_info as $info) {
                    if (isset($info['id']) && isset($info['cantidad'])) {
                        $ids_productos[] = $info['id'];
                        $cantidades[$info['id']] = $info['cantidad'];
                    }
                }
                
                if (!empty($ids_productos)) {
                    // Consultar detalles de los productos
                    $placeholders = str_repeat('?,', count($ids_productos) - 1) . '?';
                    $stmt_productos = $db->prepare("
                        SELECT id, titulo, codigo 
                        FROM productos 
                        WHERE id IN ($placeholders)
                    ");
                    $stmt_productos->execute($ids_productos);
                    $detalles_productos = $stmt_productos->fetchAll(PDO::FETCH_ASSOC);
                    
                    // Construir el nombre del producto combinado
                    $nombres_productos = [];
                    foreach ($detalles_productos as $detalle) {
                        if (isset($cantidades[$detalle['id']])) {
                            $nombres_productos[] = $detalle['titulo'] . ' (x' . $cantidades[$detalle['id']] . ')';
                        }
                    }
                    
                    $producto['producto_nombre'] = implode(' + ', $nombres_productos);
                    $producto['producto_codigo'] = implode(', ', array_column($detalles_productos, 'codigo'));
                } else {
                    // En caso de que no haya productos válidos
                    $producto['producto_nombre'] = 'Venta Unificada (sin detalles)';
                    $producto['producto_codigo'] = 'N/A';
                }
            }
            
            // Obtener cuotas de este producto en esta venta
            $stmt_cuotas = $db->prepare("
                SELECT * 
                FROM cuotas 
                WHERE venta_id = ? AND cliente_id = ? AND producto_id = ?
                ORDER BY 
                    numero_cuota ASC,
                    CASE 
                        WHEN estado = 'PAGADO' THEN 1
                        ELSE 2 
                    END,
                    fecha_pago ASC,
                    id ASC");
            $stmt_cuotas->execute([$venta_id, $id_cliente, $producto['producto_id']]);
            $cuotas_producto = $stmt_cuotas->fetchAll(PDO::FETCH_ASSOC);
            
            if (!empty($cuotas_producto)) {
                // Calcular subtotal y cantidad de cuotas
                $subtotal_producto = 0;
                $cantidad_cuotas = 0;
                $cuotas = [];
                
                foreach ($cuotas_producto as $cuota) {
                    $subtotal_producto += $cuota['monto'];
                    if ($cuota['numero_cuota'] > $cantidad_cuotas) {
                        $cantidad_cuotas = $cuota['numero_cuota'];
                    }
                    
                    // Cambiar la forma de guardar la cuota para mantener todas las cuotas del mismo número
                    // Usar un índice compuesto con número de cuota y ID
                    $indice = $cuota['numero_cuota'] . '-' . $cuota['id'];
                    $cuotas[$indice] = [
                        'id' => $cuota['id'],
                        'numero_cuota' => $cuota['numero_cuota'],
                        'monto' => $cuota['monto'],
                        'fecha_vencimiento' => $cuota['fecha_vencimiento'],
                        'estado_cuota' => $cuota['estado'],
                        'fecha_pago' => $cuota['fecha_pago']
                    ];
                    
                    // Usar la primera cuota para estimar la fecha de venta
                    if ($cuota['numero_cuota'] == 1 && $ventas[$venta_id]['fecha_venta'] === null) {
                        $ventas[$venta_id]['fecha_venta'] = date('Y-m-d', strtotime('-1 month', strtotime($cuota['fecha_vencimiento'])));
                    }

                    // Si hay al menos una cuota pendiente, la venta no está cancelada
                    if ($cuota['estado'] === 'PENDIENTE') {
                        $ventas[$venta_id]['cancelada'] = false;
                    }
                }
                
                // Guardar información del producto
                $ventas[$venta_id]['productos'][] = [
                    'producto_id' => $producto['producto_id'],
                    'producto_codigo' => $producto['producto_codigo'],
                    'producto_nombre' => $producto['producto_nombre'],
                    'subtotal' => $subtotal_producto,
                    'cantidad_cuotas' => $cantidad_cuotas,
                    'cuotas' => $cuotas
                ];
                
                // Actualizar subtotal de la venta
                $ventas[$venta_id]['subtotal'] += $subtotal_producto;
            }
        }
    }

    // Obtener conteo y totales directamente de la tabla cuotas
    $stmt = $db->prepare("
        SELECT 
            COUNT(*) as total_cuotas,
            SUM(CASE WHEN estado = 'PENDIENTE' THEN 1 ELSE 0 END) as pendientes,
            SUM(CASE WHEN estado = 'PAGADO' THEN 1 ELSE 0 END) as pagadas,
            SUM(CASE WHEN estado = 'PENDIENTE' THEN monto ELSE 0 END) as total_pendiente,
            SUM(CASE WHEN estado = 'PAGADO' THEN monto ELSE 0 END) as total_pagado
        FROM cuotas
        WHERE cliente_id = ?");
    $stmt->execute([$id_cliente]);
    $resumen = $stmt->fetch(PDO::FETCH_ASSOC);
    
    $total_pendiente = $resumen['total_pendiente'] ?? 0;
    $total_pagado = $resumen['total_pagado'] ?? 0;
    $conteo_cuotas = [
        'total_cuotas' => $resumen['total_cuotas'] ?? 0,
        'pendientes' => $resumen['pendientes'] ?? 0,
        'pagadas' => $resumen['pagadas'] ?? 0
    ];

    // Definir clase TCPDF personalizada
    class MYPDF extends TCPDF {
        protected $config;
        
        public function setConfig($config) {
            $this->config = $config;
        }
        
        public function Header() {
            if ($this->config['logo'] && file_exists('../uploads/config/' . $this->config['logo'])) {
                $this->Image('../uploads/config/' . $this->config['logo'], 15, 15, 20);
            }
            
            $this->SetY(15);
            $this->SetFont('helvetica', 'B', 12);
            $this->Cell(0, 10, $this->config['nombre_comercio'], 0, 1, 'C');
            
            $this->SetFont('helvetica', '', 10);
            $this->Cell(0, 5, $this->config['direccion'], 0, 1, 'C');
            $this->Cell(0, 5, 'Tel: ' . $this->config['telefono'], 0, 1, 'C');
            
            $this->Ln(5);
            $this->SetFont('helvetica', 'B', 14);
            $this->Cell(0, 10, 'Detalles del Cliente', 0, 1, 'C');
        }
        
        public function Footer() {
            $this->SetY(-15);
            $this->SetFont('helvetica', 'I', 8);
            $this->Cell(0, 10, 'Página ' . $this->getAliasNumPage() . '/' . $this->getAliasNbPages(), 0, 0, 'C');
        }
    }

    // Crear PDF
    $pdf = new MYPDF('P', 'mm', 'A4', true, 'UTF-8');
    $pdf->setConfig($config);
    $pdf->SetMargins(15, 50, 15);
    $pdf->AddPage();

    // Información del cliente
    $pdf->SetFont('helvetica', 'B', 11);
    $pdf->Cell(0, 8, 'Información del Cliente', 0, 1, 'L');
    $pdf->SetFont('helvetica', '', 10);

    // Agregar la información del cliente
    $pdf->Cell(40, 7, 'Nombre:', 0);
    $pdf->Cell(0, 7, $cliente['nombre'] . ' ' . $cliente['apellidos'], 0, 1);

    $pdf->Cell(40, 7, 'Documento:', 0);
    $pdf->Cell(0, 7, $cliente['tipo_documento'] . ': ' . $cliente['numero_documento'], 0, 1);

    $pdf->Cell(40, 7, 'Email:', 0);
    $pdf->Cell(0, 7, $cliente['email'] ?? 'No especificado', 0, 1);

    $pdf->Cell(40, 7, 'Teléfono:', 0);
    $pdf->Cell(0, 7, $cliente['telefono_principal'], 0, 1);

    $pdf->Cell(40, 7, 'Estado:', 0);
    $pdf->Cell(0, 7, $cliente['estado'], 0, 1);

    $pdf->Cell(40, 7, 'Categoría:', 0);
    $pdf->Cell(0, 7, $cliente['categoria'], 0, 1);

    $pdf->Ln(3);
    $pdf->Cell(40, 7, 'Total Pendiente:', 0);
    $pdf->Cell(0, 7, formatearMonto($total_pendiente, $config), 0, 1);

    $pdf->Cell(40, 7, 'Total Pagado:', 0);
    $pdf->Cell(0, 7, formatearMonto($total_pagado, $config), 0, 1);

    $pdf->Ln(3);
    $pdf->Cell(40, 7, 'Resumen Cuotas:', 0);
    $pdf->Cell(0, 7, 'Total: ' . $conteo_cuotas['total_cuotas'] . ' | ' .
                     'Pendientes: ' . $conteo_cuotas['pendientes'] . ' | ' .
                     'Pagadas: ' . $conteo_cuotas['pagadas'], 0, 1);

    // Después del resumen de cuotas, agregar solo un salto de línea pequeño
    $pdf->Ln(5);

    // Historial de Ventas y Cuotas
    $pdf->SetFont('helvetica', 'B', 11);
    $titulo_historial = 'Historial de Ventas y Cuotas';
    if ($mostrar_canceladas) {
        $titulo_historial .= ' (Incluye ventas canceladas)';
    }
    $pdf->Cell(0, 8, $titulo_historial, 0, 1, 'L');
    $pdf->Ln(2);

    // Mostrar las ventas
    foreach ($ventas as $venta_id => $venta) {
        // Solo mostrar la venta si:
        // - No está cancelada, O
        // - Está cancelada y mostrar_canceladas es true
        if (!$venta['cancelada'] || $mostrar_canceladas) {
            // Título de la venta
            $pdf->SetFont('helvetica', 'B', 10);
            $pdf->SetFillColor(240, 240, 240);
            
            $venta_title = sprintf(
                'Venta #%s - Fecha: %s - Total: %s%s',
                $venta['venta_id'],
                date('d/m/Y', strtotime($venta['fecha_venta'])),
                formatearMonto($venta['subtotal'], $config),
                $venta['cancelada'] ? ' - CANCELADA' : ''
            );
            
            $pdf->Cell(0, 8, $venta_title, 1, 1, 'L', true);

            // Mostrar productos y cuotas
            foreach ($venta['productos'] as $producto) {
                $pdf->SetFont('helvetica', 'B', 9);
                $producto_info = sprintf(
                    '[%s] %s (%s - %d cuotas)',
                    $producto['producto_codigo'],
                    $producto['producto_nombre'],
                    formatearMonto($producto['subtotal'], $config),
                    $producto['cantidad_cuotas']
                );
                
                // Reemplazar Cell por MultiCell para permitir saltos de línea automáticos
                $pdf->MultiCell(0, 6, $producto_info, 0, 'L');
                
                // Añadir un pequeño espacio después de la descripción del producto
                $pdf->Ln(1);

                // Encabezados de cuotas
                $pdf->SetFont('helvetica', '', 8);
                $pdf->Cell(20, 5, 'Cuota', 0, 0, 'L');
                $pdf->Cell(30, 5, 'Monto', 0, 0, 'L');
                $pdf->Cell(35, 5, 'Vencimiento', 0, 0, 'L');
                $pdf->Cell(35, 5, 'Estado', 0, 0, 'L');
                $pdf->Cell(35, 5, 'Fecha Pago', 0, 1, 'L');
                
                // Detalle de cuotas
                if (!empty($producto['cuotas'])) {
                    // Ordenar las cuotas primero por número de cuota y luego por ID
                    $cuotas_ordenadas = $producto['cuotas'];
                    uksort($cuotas_ordenadas, function($a, $b) {
                        $a_parts = explode('-', $a);
                        $b_parts = explode('-', $b);
                        $a_num = intval($a_parts[0]);
                        $b_num = intval($b_parts[0]);
                        
                        // Si son del mismo número de cuota
                        if ($a_num === $b_num) {
                            return intval($a_parts[1]) - intval($b_parts[1]);
                        }
                        
                        // Si son de diferentes números de cuota
                        return $a_num - $b_num;
                    });

                    foreach ($cuotas_ordenadas as $cuota) {
                        // Mostrar la cuota si:
                        // - La venta no está cancelada, O
                        // - Está activado mostrar_canceladas
                        if (!$venta['cancelada'] || $mostrar_canceladas) {
                            $pdf->Cell(20, 5, $cuota['numero_cuota'] . '/' . $producto['cantidad_cuotas'], 0, 0, 'L');
                            $pdf->Cell(30, 5, formatearMonto($cuota['monto'], $config), 0, 0, 'L');
                            $pdf->Cell(35, 5, date('d/m/Y', strtotime($cuota['fecha_vencimiento'])), 0, 0, 'L');
                            $pdf->Cell(35, 5, $cuota['estado_cuota'], 0, 0, 'L');
                            $pdf->Cell(35, 5, $cuota['fecha_pago'] ? date('d/m/Y', strtotime($cuota['fecha_pago'])) : '-', 0, 1, 'L');
                        }
                    }
                }
                $pdf->Ln(2);
            }
            $pdf->Ln(5);
        }
    }

    // Limpiar cualquier salida anterior y enviar el PDF
    if (ob_get_length()) {
        ob_clean();
    }
    
    // Asegurarse de que no hay salida anterior
    while (ob_get_level()) {
        ob_end_clean();
    }
    
    // Establecer headers correctos
    header('Content-Type: application/pdf');
    header('Cache-Control: private, max-age=0, must-revalidate');
    header('Pragma: public');
    
    $pdf->Output('detalles_cliente_' . $id_cliente . '.pdf', 'I');
    exit;

} catch (PDOException $e) {
    error_log("Error PDO: " . $e->getMessage());
    ob_clean();
    die("Error en la base de datos: " . $e->getMessage());
} catch (Exception $e) {
    error_log("Error general: " . $e->getMessage());
    ob_clean();
    die("Error en el proceso: " . $e->getMessage());
}
?>
