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

require_once '../includes/config.php';
require_once '../includes/db.php';
require_once '../tcpdf/tcpdf.php'; // Cambiado a la ruta correcta

class MYPDF extends TCPDF {
    protected $criterios;
    protected $totales;
    protected $filtros;
    protected $config;
    protected $headerHeight = 0;
    
    public function setCriterios($criterios, $totales, $filtros) {
        $this->criterios = $criterios;
        $this->totales = $totales;
        $this->filtros = $filtros;
    }

    public function setConfig($config) {
        $this->config = $config;
    }

    public function Header() {
        $startY = $this->GetY();
        
        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, 'Reporte de Ventas', 0, 1, 'C');

        $this->SetFont('helvetica', '', 8);
        $this->Cell(0, 4, 'Generado por: ' . $_SESSION['nombre'] . ' - Fecha: ' . date('d/m/Y H:i:s'), 0, 1, 'R');
        $this->Ln(2);

        // Solo mostrar criterios y resumen en la primera página
        if ($this->getPage() == 1) {
            $this->SetFont('helvetica', 'B', 9);
            $this->Cell(0, 4, 'Criterios de búsqueda:', 0, 1, 'L');
            $this->SetFont('helvetica', '', 8);
            
            $hayFiltros = false;
            foreach ($this->filtros as $label => $valor) {
                if (!empty($valor)) {
                    $this->Cell(0, 3, $label . ': ' . $valor, 0, 1, 'L');
                    $hayFiltros = true;
                }
            }
            
            if (!$hayFiltros) {
                $this->Cell(0, 3, 'Ninguno', 0, 1, 'L');
            }
            
            $this->Ln(2);
            $this->SetFont('helvetica', 'B', 9);
            $this->Cell(80, 4, 'Resumen:', 0, 1, 'L');
            $this->SetFont('helvetica', '', 8);
            $this->Cell(80, 3, 'Total Ventas: ' . number_format($this->totales['total'], 0, ',', '.') . ' ' . $this->criterios['moneda'], 0, 1, 'L');
            $this->Cell(80, 3, 'Total Contado: ' . number_format($this->totales['contado'], 0, ',', '.') . ' ' . $this->criterios['moneda'], 0, 1, 'L');
            $this->Cell(80, 3, 'Total Crédito: ' . number_format($this->totales['credito'], 0, ',', '.') . ' ' . $this->criterios['moneda'], 0, 1, 'L');
            $this->Cell(80, 3, 'Cantidad de registros: ' . $this->totales['registros'], 0, 1, 'L');
        }
        
        $this->Ln(5);
        
        $this->headerHeight = $this->GetY() - $startY;
    }
    
    public function getHeaderHeight() {
        return $this->headerHeight;
    }
    
    public function Footer() {
        $this->SetY(-15);
        $this->SetFont('helvetica', 'I', 8);
        $this->Cell(0, 10, 'Página '.$this->getAliasNumPage().'/'.$this->getAliasNbPages(), 0, 0, 'C');
    }
}

$db = new Database();

$stmt = $db->query("SELECT * FROM configuracion");  // Cambiar para obtener todos los campos
$config = $stmt->fetch(PDO::FETCH_ASSOC);

function formatNumber($number, $config) {
    return number_format($number, $config['con_decimales'] ? 2 : 0, ',', '.');
}

$where = [];
$params = [];

$sql = "SELECT 
    vi.created_at, vi.venta_id, vi.subtotal, vi.tipo_venta, vi.cantidad_cuotas,
    vi.cantidad, vi.precio_unitario,
    CONCAT(c.nombre, ' ', COALESCE(c.apellidos,''), ' - ', c.numero_documento) as cliente_nombre,
    u.nombre as vendedor_nombre,
    CONCAT(p.codigo, ' - ', p.titulo) as producto_nombre
FROM venta_items vi
LEFT JOIN productos p ON vi.producto_id = p.id
LEFT JOIN clientes c ON vi.cliente_id = c.id_cliente
LEFT JOIN usuarios u ON vi.vendedor_id = u.id
" . (!empty($where) ? " WHERE " . implode(" AND ", $where) : "") . "
ORDER BY vi.created_at DESC";

$ventas = $db->query($sql)->fetchAll(PDO::FETCH_ASSOC);

// Modificar la obtención de filtros para usar POST
$filtros_aplicados = [];
if (!empty($_POST['fecha_inicio'])) $filtros_aplicados['Fecha desde'] = $_POST['fecha_inicio'] . ' ' . ($_POST['hora_inicio'] ?? '00:00');
if (!empty($_POST['fecha_fin'])) $filtros_aplicados['Fecha hasta'] = $_POST['fecha_fin'] . ' ' . ($_POST['hora_fin'] ?? '23:59');
if (!empty($_POST['vendedor_id'])) {
    $stmt = $db->prepare("SELECT nombre FROM usuarios WHERE id = ?");
    $stmt->execute([$_POST['vendedor_id']]);
    $filtros_aplicados['Vendedor'] = $stmt->fetchColumn();
}

$totales = [
    'total' => array_sum(array_column($ventas, 'subtotal')),
    'contado' => array_sum(array_column(array_filter($ventas, function($v) { return $v['tipo_venta'] == 'contado'; }), 'subtotal')),
    'credito' => array_sum(array_column(array_filter($ventas, function($v) { return $v['tipo_venta'] == 'credito'; }), 'subtotal')),
    'registros' => count($ventas)
];

$pdf = new MYPDF('L', 'mm', 'A4', true, 'UTF-8');

$pdf->setCriterios(
    ['moneda' => $config['moneda']],
    $totales,
    $filtros_aplicados
);

$pdf->setConfig($config);

$pdf->SetCreator('Sistema de Ventas');
$pdf->SetAuthor('Administrador');
$pdf->SetTitle('Reporte de Ventas');

$pdf->AddPage();
$headerHeight = $pdf->getHeaderHeight();
$startY = $headerHeight + 0; // Reducido de 15 a 5
$pdf->SetY($startY);

$pdf->SetAutoPageBreak(true, 15);
$pdf->SetMargins(10, 50, 10);

$pdf->SetFont('helvetica', '', 8);

$headers = array('Fecha/Hora', 'Venta ID', 'Cliente', 'Vendedor', 'Producto', 'Cant.', 'Precio', 'Subtotal', 'Tipo', 'Cuotas');
$widths = array(25, 20, 50, 30, 87, 8, 15, 15, 15, 10);

foreach($headers as $i => $header) {
    $pdf->Cell($widths[$i], 7, $header, 1, 0, 'C');
}
$pdf->Ln();

foreach($ventas as $venta) {
    $height_cliente = $pdf->getStringHeight($widths[2], $venta['cliente_nombre']);
    $height_producto = $pdf->getStringHeight($widths[4], $venta['producto_nombre']);
    $row_height = max($height_cliente, $height_producto, 6);

    $pdf->Cell($widths[0], $row_height, date('d/m/Y H:i', strtotime($venta['created_at'])), 1);
    $pdf->Cell($widths[1], $row_height, $venta['venta_id'], 1);
    
    $pdf->MultiCell($widths[2], $row_height, $venta['cliente_nombre'], 1, 'L', false, 0);
    
    $pdf->Cell($widths[3], $row_height, substr($venta['vendedor_nombre'], 0, 20), 1);
    
    $pdf->MultiCell($widths[4], $row_height, $venta['producto_nombre'], 1, 'L', false, 0);
    
    $pdf->Cell($widths[5], $row_height, $venta['cantidad'], 1, 0, 'R');
    $pdf->Cell($widths[6], $row_height, formatNumber($venta['precio_unitario'], $config), 1, 0, 'R');
    $pdf->Cell($widths[7], $row_height, formatNumber($venta['subtotal'], $config), 1, 0, 'R');
    $pdf->Cell($widths[8], $row_height, ucfirst($venta['tipo_venta']), 1, 0, 'C');
    $pdf->Cell($widths[9], $row_height, $venta['cantidad_cuotas'], 1, 0, 'R');
    $pdf->Ln();
}

// Después de crear la tabla agregar los gráficos
if (!empty($_POST['chart_ventas_tipo']) || !empty($_POST['chart_top_productos'])) {
    $pdf->AddPage();
    $pdf->SetFont('helvetica', 'B', 12);
    $pdf->Cell(0, 10, 'Gráficos del Reporte', 0, 1, 'C');
    
    // Posición inicial para el primer gráfico
    $currentY = $pdf->GetY() + 5;

    if (!empty($_POST['chart_ventas_tipo'])) {
        $pdf->SetFont('helvetica', 'B', 10);
        $pdf->Cell(0, 10, 'Ventas por Tipo', 0, 1, 'L');
        $img_data = base64_decode(explode(',', $_POST['chart_ventas_tipo'])[1]);
        $pdf->Image('@'.$img_data, 15, $currentY + 10, 80); // Reducido a 80mm
    }

    if (!empty($_POST['chart_top_productos'])) {
        // Posicionar a la derecha del primer gráfico
        $pdf->SetY($currentY);
        $pdf->SetX(100); // Comenzar después del primer gráfico
        $pdf->SetFont('helvetica', 'B', 10);
        $pdf->Cell(0, 10, 'Top 10 Productos', 0, 1, 'L');
        $img_data = base64_decode(explode(',', $_POST['chart_top_productos'])[1]);
        $pdf->Image('@'.$img_data, 100, $currentY + 10, 180);
    }

    if (!empty($_POST['chart_ventas_dia'])) {
        // Posicionar debajo de los dos gráficos anteriores
        $pdf->SetY($currentY + 90); // Espacio suficiente para los gráficos anteriores
        $pdf->SetX(15);
        $pdf->SetFont('helvetica', 'B', 10);
        $pdf->Cell(0, 10, 'Evolución de Ventas', 0, 1, 'L');
        $img_data = base64_decode(explode(',', $_POST['chart_ventas_dia'])[1]);
        $pdf->Image('@'.$img_data, 15, $currentY + 100, 265); // Ancho completo disponible
    }
}

$pdf->Output('reporte_ventas.pdf', 'I');
