<?php
session_start();
if (!isset($_SESSION['usuario_id']) || empty($_SESSION['usuario_id']) || $_SESSION['rol'] != 'admin') {
    exit('Acceso denegado');
}

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

class MYPDF extends TCPDF {
    protected $filtros;
    protected $totales;
    protected $config;
    protected $mes;
    protected $anio;
    protected $encabezadoTablaImpreso = false;
    
    public function setData($config, $filtros, $totales, $mes = null, $anio = null) {
        $this->config = $config;
        $this->filtros = $filtros;
        $this->totales = $totales;
        $this->mes = $mes;
        $this->anio = $anio;
    }
    
    public function Header() {
        // No imprimir el encabezado de tabla en el header
        // solo información general
        $startY = $this->GetY();
        
        // Logo
        if (!empty($this->config['logo']) && file_exists('../uploads/config/' . $this->config['logo'])) {
            $this->Image('../uploads/config/' . $this->config['logo'], 15, 10, 20);
        } else if (!empty($this->config['favicon']) && file_exists('../' . $this->config['favicon'])) {
            $this->Image('../' . $this->config['favicon'], 15, 10, 20);
        }
        
        // Mover a posición inicial
        $this->SetY(10);
        $this->SetX(40); // Mover a la derecha del logo
        
        // Nombre de la empresa
        $this->SetFont('helvetica', 'B', 12);
        $this->Cell(0, 10, $this->config['nombre_comercio'], 0, 1, 'C');
        
        // Dirección y teléfono
        $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');
        
        // Título del reporte
        $this->SetFont('helvetica', 'B', 14);
        $this->Cell(0, 10, 'REPORTE DE FACTURACIÓN', 0, 1, 'C');
        
        // Título con mes y año si están definidos
        if ($this->mes && $this->anio) {
            $meses = [
                1 => 'Enero', 2 => 'Febrero', 3 => 'Marzo', 4 => 'Abril', 
                5 => 'Mayo', 6 => 'Junio', 7 => 'Julio', 8 => 'Agosto',
                9 => 'Septiembre', 10 => 'Octubre', 11 => 'Noviembre', 12 => 'Diciembre'
            ];
            $nombreMes = isset($meses[(int)$this->mes]) ? $meses[(int)$this->mes] : '';
            $this->SetFont('helvetica', 'B', 12);
            $this->Cell(0, 8, "Correspondiente a: $nombreMes $this->anio", 0, 1, 'C');
        }
        
        $this->SetFont('helvetica', 'I', 9);
        $this->Cell(0, 5, 'Generado por: ' . $_SESSION['nombre'] . ' - Fecha: ' . date('d/m/Y H:i:s'), 0, 1, 'R');
        
        // Línea divisoria
        $this->Line(15, $this->GetY() + 1, 195, $this->GetY() + 1);
        $this->Ln(3);
        
        // Criterios de filtro
        if (!empty($this->filtros)) {
            $this->SetFont('helvetica', 'B', 9);
            $this->Cell(0, 5, 'CRITERIOS DE FILTRO:', 0, 1, 'L');
            $this->SetFont('helvetica', '', 9);
            
            foreach ($this->filtros as $label => $valor) {
                if (!empty($valor)) {
                    $this->Cell(0, 5, "$label: $valor", 0, 1, 'L');
                }
            }
        }
        
        // Añadir más espacio vertical para evitar superposición
        $this->Ln(10);
    }
    
    // Método para imprimir el encabezado de la tabla (separado del header)
    public function imprimirEncabezadoTabla() {
        // Asegurar suficiente espacio antes del encabezado de tabla
        $currentY = $this->GetY();
        // Si estamos muy cerca del inicio de la página (después del header), 
        // añadimos espacio adicional para evitar la superposición
        if ($currentY < 45) {
            $this->SetY(45); // Aseguramos una posición fija después del header
        }
        
        // Añadir línea divisoria antes del encabezado de tabla
        $this->SetDrawColor(150, 150, 150);
        $this->Line(15, $this->GetY() - 5, 195, $this->GetY() - 5);
        $this->SetDrawColor(0, 0, 0); // Restaurar color de línea por defecto
        
        // Título de la sección
        $this->SetFont('helvetica', 'B', 10);
        $this->Cell(0, 6, 'DETALLE DE FACTURAS:', 0, 1, 'L');
        $this->Ln(2);
        
        // Cabecera de tabla
        $this->SetFillColor(52, 58, 64); // Color gris oscuro
        $this->SetTextColor(255);
        $this->SetFont('', 'B', 9);
        
        // Ancho de columnas
        $w1 = 30; // Nº Factura
        $w2 = 45; // Cliente
        $w3 = 25; // RUC
        $w4 = 20; // Fecha
        $w5 = 25; // Condición
        $w6 = 25; // Subtotal
        $w7 = 15; // IVA
        
        // Títulos de columnas
        $this->Cell($w1, 7, 'Nº Factura', 1, 0, 'C', true);
        $this->Cell($w2, 7, 'Cliente', 1, 0, 'C', true);
        $this->Cell($w3, 7, 'RUC', 1, 0, 'C', true);
        $this->Cell($w4, 7, 'Fecha', 1, 0, 'C', true);
        $this->Cell($w5, 7, 'Condición', 1, 0, 'C', true);
        $this->Cell($w6, 7, 'Subtotal', 1, 0, 'C', true);
        $this->Cell($w7, 7, 'IVA', 1, 1, 'C', true);
        
        // Restaurar color
        $this->SetFillColor(240, 240, 240);
        $this->SetTextColor(0);
        
        $this->encabezadoTablaImpreso = true;
    }
    
    public function Footer() {
        // Posición a 45 mm del final para tener más espacio
        $this->SetY(-50);
        
        // Línea divisoria
        $this->Line(15, $this->GetY(), 195, $this->GetY());
        $this->Ln(2);
        
        // Información de totales - Con un borde y formato mejorado
        $this->SetFont('helvetica', 'B', 10);
        $this->Cell(0, 7, 'RESUMEN DE TOTALES', 0, 1, 'L');
        
        // Crear una tabla de resumen con dos columnas
        $this->SetFont('helvetica', '', 9);
        $colWidth = 95; // Ancho de cada columna
        
        // Usamos un recuadro con fondo para los totales
        $this->SetFillColor(230, 230, 230);
        
        // Primera fila
        $this->Cell($colWidth/2, 6, 'Total Facturas:', 1, 0, 'L', true);
        $this->Cell($colWidth/2, 6, number_format($this->totales['cantidad'], 0, ',', '.'), 1, 0, 'C', true);
        $this->Cell($colWidth/2, 6, 'Total IVA 5%:', 1, 0, 'L', true);
        $this->Cell($colWidth/2, 6, number_format($this->totales['iva5'], 0, ',', '.') . ' Gs.', 1, 1, 'C', true);
        
        // Segunda fila
        $this->Cell($colWidth/2, 6, 'Monto Total:', 1, 0, 'L', true);
        $this->Cell($colWidth/2, 6, number_format($this->totales['monto_total'], 0, ',', '.') . ' Gs.', 1, 0, 'C', true);
        $this->Cell($colWidth/2, 6, 'Total IVA 10%:', 1, 0, 'L', true);
        $this->Cell($colWidth/2, 6, number_format($this->totales['iva10'], 0, ',', '.') . ' Gs.', 1, 1, 'C', true);
        
        // Tercera fila
        $this->Cell($colWidth/2, 6, 'Total Contado:', 1, 0, 'L', true);
        $this->Cell($colWidth/2, 6, number_format($this->totales['contado'], 0, ',', '.') . ' Gs.', 1, 0, 'C', true);
        $this->Cell($colWidth/2, 6, 'Total IVA:', 1, 0, 'L', true);
        $this->Cell($colWidth/2, 6, number_format($this->totales['iva_total'], 0, ',', '.') . ' Gs.', 1, 1, 'C', true);
        
        // Cuarta fila
        $this->Cell($colWidth/2, 6, 'Total Crédito:', 1, 0, 'L', true);
        $this->Cell($colWidth/2, 6, number_format($this->totales['credito'], 0, ',', '.') . ' Gs.', 1, 0, 'C', true);
        $this->Cell($colWidth/2, 6, 'Subtotal (sin IVA):', 1, 0, 'L', true);
        $this->Cell($colWidth/2, 6, number_format($this->totales['subtotal'], 0, ',', '.') . ' Gs.', 1, 1, 'C', true);
        
        // Número de página
        $this->Ln(2);
        $this->SetFont('helvetica', 'I', 8);
        $this->Cell(0, 5, 'Página ' . $this->getAliasNumPage() . '/' . $this->getAliasNbPages(), 0, 0, 'C');
    }
}

// Inicializar la base de datos
$db = new Database();
$pdo = $db->getPDO();

// Obtener configuración
$stmt = $pdo->prepare("SELECT * FROM configuracion LIMIT 1");
$stmt->execute();
$config = $stmt->fetch(PDO::FETCH_ASSOC);

// Filtros
$where = "1=1";
$params = [];
$filtros = [];

if (isset($_GET['buscar']) && !empty($_GET['buscar'])) {
    $buscar = '%' . $_GET['buscar'] . '%';
    $where .= " AND (f.cliente_nombre LIKE ? OR f.cliente_ruc LIKE ? OR f.factura_numero LIKE ? OR f.producto_titulo LIKE ?)";
    $params = array_merge($params, [$buscar, $buscar, $buscar, $buscar]);
    $filtros['Búsqueda'] = $_GET['buscar'];
}

if (isset($_GET['desde']) && !empty($_GET['desde'])) {
    $where .= " AND DATE(f.fecha_factura) >= ?";
    $params[] = $_GET['desde'];
    $filtros['Fecha desde'] = date('d/m/Y', strtotime($_GET['desde']));
}

if (isset($_GET['hasta']) && !empty($_GET['hasta'])) {
    $where .= " AND DATE(f.fecha_factura) <= ?";
    $params[] = $_GET['hasta'];
    $filtros['Fecha hasta'] = date('d/m/Y', strtotime($_GET['hasta']));
}

if (isset($_GET['condicion']) && !empty($_GET['condicion'])) {
    $where .= " AND f.condicion = ?";
    $params[] = $_GET['condicion'];
    $filtros['Condición'] = ucfirst($_GET['condicion']);
}

if (isset($_GET['estado']) && !empty($_GET['estado'])) {
    $where .= " AND f.estado = ?";
    $params[] = $_GET['estado'];
    $filtros['Estado'] = ucfirst($_GET['estado']);
}

// Obtener mes y año para el título del reporte (opcional)
$mes = null;
$anio = null;

if (isset($_GET['desde']) && !empty($_GET['desde'])) {
    $fecha = new DateTime($_GET['desde']);
    $mes = $fecha->format('m');
    $anio = $fecha->format('Y');
}

// Obtener datos agrupados por factura sin límite
try {
    $sql = "
        SELECT 
            f.factura_numero,
            MAX(f.cliente_nombre) as cliente_nombre,
            MAX(f.cliente_ruc) as cliente_ruc,
            MAX(f.condicion) as condicion,
            MAX(f.estado) as estado,
            MAX(DATE(f.fecha_factura)) as fecha,
            SUM(f.total) as monto_total,
            SUM(f.monto_iva) as monto_iva,
            SUM(CASE WHEN f.iva = 5 THEN f.monto_iva ELSE 0 END) as iva5,
            SUM(CASE WHEN f.iva = 10 THEN f.monto_iva ELSE 0 END) as iva10,
            SUM(f.subtotal) as subtotal,
            COUNT(f.id) as cantidad_items,
            MAX(f.dias_credito) as dias_credito
        FROM facturados f
        WHERE $where
        GROUP BY f.factura_numero
        ORDER BY MAX(f.fecha_factura) ASC
    ";

    $stmt = $pdo->prepare($sql);
    $stmt->execute($params);
    $facturas = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    // Calcular totales
    $totalFacturas = count($facturas);
    $montoTotal = 0;
    $totalContado = 0;
    $totalCredito = 0;
    $totalIva = 0;
    $totalIva5 = 0;
    $totalIva10 = 0;
    $totalSubtotal = 0;
    
    foreach ($facturas as $factura) {
        $montoTotal += $factura['monto_total'];
        $totalIva += $factura['monto_iva'];
        $totalIva5 += $factura['iva5'];
        $totalIva10 += $factura['iva10'];
        $totalSubtotal += $factura['subtotal'];
        
        if ($factura['condicion'] === 'contado') {
            $totalContado += $factura['monto_total'];
        } else {
            $totalCredito += $factura['monto_total'];
        }
    }
    
    $totales = [
        'cantidad' => $totalFacturas,
        'monto_total' => $montoTotal,
        'contado' => $totalContado,
        'credito' => $totalCredito,
        'iva_total' => $totalIva,
        'iva5' => $totalIva5,
        'iva10' => $totalIva10,
        'subtotal' => $totalSubtotal
    ];
    
    // Crear PDF
    $pdf = new MYPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    
    // Configurar el PDF
    $pdf->setData($config, $filtros, $totales, $mes, $anio);
    
    // Configuración básica
    $pdf->SetCreator('Sistema de Facturación');
    $pdf->SetAuthor('Administrador');
    $pdf->SetTitle('Reporte de Facturación');
    $pdf->SetSubject('Reporte para Contador');
    $pdf->SetKeywords('Factura, Reporte, Contador');
    
    // Establecer márgenes
    $pdf->SetMargins(15, 15, 15);
    $pdf->SetHeaderMargin(10);
    $pdf->SetFooterMargin(10);
    
    // Auto salto de página con amplio espacio para el pie de página
    $pdf->SetAutoPageBreak(TRUE, 50);
    
    // Agregar página
    $pdf->AddPage();
    
    // Fuente y color para el contenido
    $pdf->SetFont('helvetica', '', 9);
    
    // Imprimir encabezado de tabla (ahora lo hacemos explícitamente)
    $pdf->imprimirEncabezadoTabla();
    
    // Ancho de columnas
    $w1 = 30; // Nº Factura
    $w2 = 45; // Cliente
    $w3 = 25; // RUC
    $w4 = 20; // Fecha
    $w5 = 25; // Condición
    $w6 = 25; // Subtotal
    $w7 = 15; // IVA
    
    // Alternar colores de fondo
    $fill = false;
    
        // Recorrer las facturas y añadirlas al PDF
    foreach ($facturas as $factura) {
        // Si la altura restante es menor a 15mm, agregar nueva página
        if ($pdf->GetY() > $pdf->getPageHeight() - 60) {
            $pdf->AddPage();
            // Reimprimir el encabezado de tabla en la nueva página
            $pdf->imprimirEncabezadoTabla();
        }
        
        // Guardar la posición Y inicial de esta fila
        $startY = $pdf->GetY();
        $currentX = $pdf->GetX();
        
        // Calcular primero la altura máxima necesaria usando un PDF temporal
        $tempPdf = clone $pdf;
        $maxHeight = 6; // Altura mínima
        
        // Calcular altura necesaria para cada celda
        $tempPdf->startTransaction();
        
        // Número de factura
        $tempPdf->MultiCell($w1, 0, $factura['factura_numero'], 1, 'L', $fill);
        $maxHeight = max($maxHeight, $tempPdf->GetY() - $startY);
        
        // Cliente
        $tempPdf->SetXY($currentX, $startY);
        $tempPdf->MultiCell($w2, 0, $factura['cliente_nombre'], 1, 'L', $fill);
        $maxHeight = max($maxHeight, $tempPdf->GetY() - $startY);
        
        // RUC
        $tempPdf->SetXY($currentX, $startY);
        $tempPdf->MultiCell($w3, 0, $factura['cliente_ruc'], 1, 'C', $fill);
        $maxHeight = max($maxHeight, $tempPdf->GetY() - $startY);
        
        // Fecha
        $tempPdf->SetXY($currentX, $startY);
        $tempPdf->MultiCell($w4, 0, date('d/m/Y', strtotime($factura['fecha'])), 1, 'C', $fill);
        $maxHeight = max($maxHeight, $tempPdf->GetY() - $startY);
        
        // Condición con días de crédito
        $condicionTexto = ucfirst($factura['condicion']);
        if ($factura['condicion'] === 'credito' && !empty($factura['dias_credito'])) {
            $condicionTexto .= ' (' . $factura['dias_credito'] . ' días)';
        }
        $tempPdf->SetXY($currentX, $startY);
        $tempPdf->MultiCell($w5, 0, $condicionTexto, 1, 'C', $fill);
        $maxHeight = max($maxHeight, $tempPdf->GetY() - $startY);
        
        // Subtotal
        $tempPdf->SetXY($currentX, $startY);
        $tempPdf->MultiCell($w6, 0, number_format($factura['subtotal'], 0, ',', '.'), 1, 'C', $fill);
        $maxHeight = max($maxHeight, $tempPdf->GetY() - $startY);
        
        // IVA
        $tempPdf->SetXY($currentX, $startY);
        $tempPdf->MultiCell($w7, 0, number_format($factura['monto_iva'], 0, ',', '.'), 1, 'C', $fill);
        $maxHeight = max($maxHeight, $tempPdf->GetY() - $startY);
        
        $tempPdf->rollbackTransaction(true);
        
        // Ahora imprimir las celdas con la altura uniforme
        // Número de factura
        $pdf->MultiCell($w1, $maxHeight, $factura['factura_numero'], 1, 'L', $fill, 0);
        
        // Cliente
        $pdf->MultiCell($w2, $maxHeight, $factura['cliente_nombre'], 1, 'L', $fill, 0);
        
        // RUC
        $pdf->MultiCell($w3, $maxHeight, $factura['cliente_ruc'], 1, 'C', $fill, 0);
        
        // Fecha
        $pdf->MultiCell($w4, $maxHeight, date('d/m/Y', strtotime($factura['fecha'])), 1, 'C', $fill, 0);
        
        // Condición
        $pdf->MultiCell($w5, $maxHeight, $condicionTexto, 1, 'C', $fill, 0);
        
        // Subtotal
        $pdf->MultiCell($w6, $maxHeight, number_format($factura['subtotal'], 0, ',', '.'), 1, 'C', $fill, 0);
        
        // IVA (última celda de la fila)
        $pdf->MultiCell($w7, $maxHeight, number_format($factura['monto_iva'], 0, ',', '.'), 1, 'C', $fill, 1);
        
        // No necesitamos mover manualmente a la siguiente línea porque el último MultiCell ya lo hace        // Alternar colores
        $fill = !$fill;
    }
    
    // Nombre del archivo
    $tituloReporte = 'Reporte_Facturas';
    if ($mes && $anio) {
        $meses = [
            1 => 'Enero', 2 => 'Febrero', 3 => 'Marzo', 4 => 'Abril', 
            5 => 'Mayo', 6 => 'Junio', 7 => 'Julio', 8 => 'Agosto',
            9 => 'Septiembre', 10 => 'Octubre', 11 => 'Noviembre', 12 => 'Diciembre'
        ];
        $nombreMes = isset($meses[(int)$mes]) ? $meses[(int)$mes] : '';
        $tituloReporte .= '_' . $nombreMes . '_' . $anio;
    } else {
        $tituloReporte .= '_' . date('d-m-Y');
    }
    
    // Limpiar cualquier salida anterior
    if (ob_get_contents()) ob_clean();
    
    // Generar el PDF
    $pdf->Output($tituloReporte . '.pdf', 'I');
    
} catch (PDOException $e) {
    exit("Error en la base de datos: " . $e->getMessage());
}
