<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

include_once __DIR__ . '/../../conexion.php';
require_once __DIR__ . '/../../tcpdf/tcpdf.php';

try {
    $bodyRequest = file_get_contents("php://input");
    $datos = json_decode($bodyRequest, true);

    if (!isset($datos[0], $datos[1], $datos[2])) {
        throw new Exception("Parámetros inválidos.");
    }

    $empresaId   = (int)$datos[0];
    $sucursalId  = (int)$datos[1];
    $tipoInforme = (int)$datos[2]; // 0 TODOS, 1 ZONA, 2 SUBZONA
    $idFiltro    = isset($datos[3]) ? (int)$datos[3] : 0;

    $titulo = 'REPORTE DE CLIENTES';
    $whereExtra = '';
    $order = 'ORDER BY c.nombre ASC';

    if ($tipoInforme == 1) {
        $titulo = 'REPORTE DE CLIENTES POR ZONA';

        if ($idFiltro > 0) {
            $whereExtra = ' AND c.zona_id = :id_filtro ';
        }

        // IMPORTANTE: por zona agrupa zona y dentro subzona
        $order = 'ORDER BY z.nombre ASC, sz.nombre ASC, c.nombre ASC';

    } elseif ($tipoInforme == 2) {
        $titulo = 'REPORTE DE CLIENTES POR SUB ZONA';

        if ($idFiltro > 0) {
            $whereExtra = ' AND c.subzona_id = :id_filtro ';
        }

        $order = 'ORDER BY sz.nombre ASC, c.nombre ASC';

    } elseif ($tipoInforme != 0) {
        throw new Exception("Tipo de informe no válido.");
    }

    $sql = "
        SELECT 
            c.id,
            c.nombre,
            c.documento_identidad,
            c.direccion,
            c.telefono1,
            COALESCE(z.nombre, 'SIN ZONA') AS zona,
            COALESCE(sz.nombre, 'SIN SUB ZONA') AS subzona
        FROM clientes c
        LEFT JOIN zonas z 
               ON z.id = c.zona_id
              AND z.empresa_id = c.empresa_id
        LEFT JOIN subzonas sz 
               ON sz.id = c.subzona_id
              AND sz.empresa_id = c.empresa_id
        WHERE c.empresa_id = :empresa_id
          AND c.sucursal_id = :sucursal_id
          AND c.activo = true
          $whereExtra
        $order
    ";

    $stmt = $conn->prepare($sql);
    $stmt->bindValue(':empresa_id', $empresaId, PDO::PARAM_INT);
    $stmt->bindValue(':sucursal_id', $sucursalId, PDO::PARAM_INT);

    if ($idFiltro > 0 && ($tipoInforme == 1 || $tipoInforme == 2)) {
        $stmt->bindValue(':id_filtro', $idFiltro, PDO::PARAM_INT);
    }

    $stmt->execute();
    $datosReporte = $stmt->fetchAll(PDO::FETCH_ASSOC);

    if (empty($datosReporte)) {
        throw new Exception("No se encontraron datos para el reporte solicitado.");
    }

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetMargins(8, 8, 8);
    $pdf->SetAutoPageBreak(true, 10);
    $pdf->SetPrintHeader(false);
    $pdf->SetPrintFooter(false);
    $pdf->AddPage();

    $pdf->SetFont('courier', 'B', 11);
    $pdf->Cell(0, 7, $titulo, 0, 1, 'C');

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

    if ($tipoInforme == 1) {
        $texto = ($idFiltro > 0) ? 'ZONA: ' . strtoupper($datosReporte[0]['zona']) : 'TODAS LAS ZONAS';
        $pdf->Cell(0, 5, $texto, 0, 1, 'C');
    } elseif ($tipoInforme == 2) {
        $texto = ($idFiltro > 0) ? 'SUB ZONA: ' . strtoupper($datosReporte[0]['subzona']) : 'TODAS LAS SUB ZONAS';
        $pdf->Cell(0, 5, $texto, 0, 1, 'C');
    } else {
        $pdf->Cell(0, 5, 'TODOS LOS CLIENTES', 0, 1, 'C');
    }

    $pdf->Ln(4);

    function linea($pdf) {
        $pdf->SetFont('courier', '', 7);
        $pdf->Cell(0, 3, str_repeat('-', 125), 0, 1, 'L');
    }

    function cabeceraClientes($pdf) {
        $pdf->SetFont('courier', 'B', 7);
        $pdf->Cell(12, 5, 'ID', 0, 0, 'L');
        $pdf->Cell(78, 5, 'CLIENTE', 0, 0, 'L');
        $pdf->Cell(70, 5, 'DIRECCION', 0, 0, 'L');
        $pdf->Cell(35, 5, 'OTROS', 0, 1, 'L');
        linea($pdf);
    }

    function imprimirCliente($pdf, $row) {
        $cliente   = mb_strtoupper(trim($row['nombre'] ?? ''), 'UTF-8');
        $direccion = mb_strtoupper(trim($row['direccion'] ?? ''), 'UTF-8');
        $doc       = trim($row['documento_identidad'] ?? '');

        $otros = ($doc !== '') ? 'RUC ' . $doc : '';

        $pdf->SetFont('courier', '', 7);
        $pdf->Cell(12, 5, str_pad($row['id'], 6, '0', STR_PAD_LEFT), 0, 0, 'L');
        $pdf->Cell(78, 5, mb_substr($cliente, 0, 42), 0, 0, 'L');
        $pdf->Cell(70, 5, mb_substr($direccion, 0, 42), 0, 0, 'L');
        $pdf->Cell(35, 5, mb_substr($otros, 0, 22), 0, 1, 'L');
    }

    $totalGeneral = 0;

    if ($tipoInforme == 1) {

        $zonaActual = null;
        $subzonaActual = null;

        $contadorZona = 0;
        $contadorSubzona = 0;

        foreach ($datosReporte as $row) {

            $zona = trim($row['zona'] ?? 'SIN ZONA');
            $subzona = trim($row['subzona'] ?? 'SIN SUB ZONA');

            if ($zonaActual !== $zona) {

                if ($subzonaActual !== null) {
                    linea($pdf);
                    $pdf->SetFont('courier', 'B', 8);
                    $pdf->Cell(0, 5, $contadorSubzona . ' Cliente' . ($contadorSubzona == 1 ? '' : 's'), 0, 1, 'C');
                    $pdf->Ln(2);
                }

                if ($zonaActual !== null) {
                    $pdf->SetFont('courier', 'B', 8);
                    $pdf->Cell(0, 6, 'TOTAL ZONA ' . strtoupper($zonaActual) . ': ' . $contadorZona . ' CLIENTE' . ($contadorZona == 1 ? '' : 'S'), 0, 1, 'R');
                    $pdf->Ln(4);
                }

                $zonaActual = $zona;
                $subzonaActual = null;
                $contadorZona = 0;

                $pdf->SetFont('courier', 'B', 9);
                $pdf->Cell(0, 6, '<< ZONA: ' . strtoupper($zonaActual) . ' >>', 0, 1, 'L');
                $pdf->Ln(1);
            }

            if ($subzonaActual !== $subzona) {

                if ($subzonaActual !== null) {
                    linea($pdf);
                    $pdf->SetFont('courier', 'B', 8);
                    $pdf->Cell(0, 5, $contadorSubzona . ' Cliente' . ($contadorSubzona == 1 ? '' : 's'), 0, 1, 'C');
                    $pdf->Ln(2);
                }

                $subzonaActual = $subzona;
                $contadorSubzona = 0;

                $pdf->SetFont('courier', 'B', 8);
                $pdf->Cell(0, 6, '   << SUB ZONA: ' . strtoupper($subzonaActual) . ' >>', 0, 1, 'L');
                cabeceraClientes($pdf);
            }

            imprimirCliente($pdf, $row);

            $contadorSubzona++;
            $contadorZona++;
            $totalGeneral++;
        }

        if ($subzonaActual !== null) {
            linea($pdf);
            $pdf->SetFont('courier', 'B', 8);
            $pdf->Cell(0, 5, $contadorSubzona . ' Cliente' . ($contadorSubzona == 1 ? '' : 's'), 0, 1, 'C');
            $pdf->Ln(2);
        }

        if ($zonaActual !== null) {
            $pdf->SetFont('courier', 'B', 8);
            $pdf->Cell(0, 6, 'TOTAL ZONA ' . strtoupper($zonaActual) . ': ' . $contadorZona . ' CLIENTE' . ($contadorZona == 1 ? '' : 'S'), 0, 1, 'R');
        }

    } else {

        $grupoActual = null;
        $contadorGrupo = 0;

        foreach ($datosReporte as $row) {

            $subzona = ($tipoInforme == 2)
                ? trim($row['subzona'] ?? 'SIN SUB ZONA')
                : 'TODOS LOS CLIENTES';

            if ($grupoActual !== $subzona) {

                if ($grupoActual !== null) {
                    linea($pdf);
                    $pdf->SetFont('courier', 'B', 8);
                    $pdf->Cell(0, 5, $contadorGrupo . ' Cliente' . ($contadorGrupo == 1 ? '' : 's'), 0, 1, 'C');
                    $pdf->Ln(3);
                }

                $grupoActual = $subzona;
                $contadorGrupo = 0;

                $pdf->SetFont('courier', 'B', 8);
                $pdf->Cell(0, 6, '<< ' . strtoupper($grupoActual) . ' >>', 0, 1, 'L');
                cabeceraClientes($pdf);
            }

            imprimirCliente($pdf, $row);

            $contadorGrupo++;
            $totalGeneral++;
        }

        if ($grupoActual !== null) {
            linea($pdf);
            $pdf->SetFont('courier', 'B', 8);
            $pdf->Cell(0, 5, $contadorGrupo . ' Cliente' . ($contadorGrupo == 1 ? '' : 's'), 0, 1, 'C');
        }
    }

    $pdf->Ln(5);
    $pdf->SetFont('courier', 'B', 9);
    $pdf->Cell(0, 7, 'TOTAL GENERAL: ' . $totalGeneral . ' CLIENTES', 0, 1, 'C');

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

} catch (Exception $e) {
    http_response_code(500);

    if (!headers_sent()) {
        header("Content-Type: application/json; charset=utf-8");
    }

    echo json_encode([
        "estado" => "0",
        "mensaje" => $e->getMessage()
    ]);
}
?>