<?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';

header("Content-Type: application/pdf; charset=utf-8");

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 ';
        }

        $order = 'ORDER BY z.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 z.nombre ASC, 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.");
    }

    $nombreFiltro = '';

    if ($idFiltro > 0) {
        if ($tipoInforme == 1) {
            $nombreFiltro = $datosReporte[0]['zona'];
        } elseif ($tipoInforme == 2) {
            $nombreFiltro = $datosReporte[0]['subzona'];
        }
    }

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetMargins(7, 10, 7);
    $pdf->SetAutoPageBreak(true, 10);
    $pdf->SetDisplayMode(100, 'SinglePage');
    $pdf->AddPage();

    $logo_path = '../../tcpdf/logos/20561153745.png';

    if (file_exists($logo_path)) {
        $pdf->Image($logo_path, '', '', 30, 15, '', '', 'T', false, 300, 'C', false, false, 0, false, false, false);
    }

    $pdf->Ln(18);

    $pdf->SetFont('helvetica', 'B', 13);
    $pdf->Cell(0, 8, $titulo, 0, 1, 'C');

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

    if ($tipoInforme == 1) {
        $textoFiltro = ($idFiltro == 0) ? 'TODAS LAS ZONAS' : 'ZONA: ' . $nombreFiltro;
        $pdf->Cell(0, 5, $textoFiltro, 0, 1, 'C');

    } elseif ($tipoInforme == 2) {
        $textoFiltro = ($idFiltro == 0) ? 'TODAS LAS SUB ZONAS' : 'SUB ZONA: ' . $nombreFiltro;
        $pdf->Cell(0, 5, $textoFiltro, 0, 1, 'C');

    } else {
        $pdf->Cell(0, 5, 'TODOS LOS CLIENTES', 0, 1, 'C');
    }

    $pdf->Ln(3);

    function imprimirCabeceraTabla($pdf, $tipoInforme) {
        $pdf->SetFillColor(5, 152, 172);
        $pdf->SetTextColor(255, 255, 255);
        $pdf->SetDrawColor(0, 0, 0);
        $pdf->SetFont('helvetica', 'B', 7);

        if ($tipoInforme == 1) {
            $pdf->Cell(10, 7, 'ID', 1, 0, 'C', true);
            $pdf->Cell(68, 7, 'CLIENTE', 1, 0, 'C', true);
            $pdf->Cell(25, 7, 'DOCUMENTO', 1, 0, 'C', true);
            $pdf->Cell(63, 7, 'DIRECCION', 1, 0, 'C', true);
            $pdf->Cell(30, 7, 'ZONA', 1, 1, 'C', true);
        } else {
            $pdf->Cell(10, 7, 'ID', 1, 0, 'C', true);
            $pdf->Cell(58, 7, 'CLIENTE', 1, 0, 'C', true);
            $pdf->Cell(24, 7, 'DOCUMENTO', 1, 0, 'C', true);
            $pdf->Cell(48, 7, 'DIRECCION', 1, 0, 'C', true);
            $pdf->Cell(27, 7, 'ZONA', 1, 0, 'C', true);
            $pdf->Cell(29, 7, 'SUB ZONA', 1, 1, 'C', true);
        }

        $pdf->SetTextColor(0, 0, 0);
        $pdf->SetFont('helvetica', '', 6.5);
    }

    imprimirCabeceraTabla($pdf, $tipoInforme);

    $grupoActual = '';
    $contadorGrupo = 0;
    $totalGeneral = 0;

    foreach ($datosReporte as $row) {

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

        if ($tipoInforme == 1) {
            $grupo = $zona;
            $textoGrupo = 'ZONA: ' . $zona;
        } elseif ($tipoInforme == 2) {
            $grupo = $subzona;
            $textoGrupo = 'SUB ZONA: ' . $subzona;
        } else {
            $grupo = '';
            $textoGrupo = '';
        }

        if (($tipoInforme == 1 || $tipoInforme == 2) && $idFiltro == 0) {
            if ($grupo !== $grupoActual) {

                if ($grupoActual !== '') {
                    $pdf->SetFont('helvetica', 'B', 7);
                    $pdf->Cell(196, 6, 'TOTAL DEL GRUPO: ' . $contadorGrupo, 1, 1, 'R');
                    $pdf->Ln(2);
                    $contadorGrupo = 0;
                }

                $pdf->SetFont('helvetica', 'B', 8);
                $pdf->SetFillColor(230, 230, 230);
                $pdf->SetTextColor(0, 0, 0);
                $pdf->Cell(196, 6, $textoGrupo, 1, 1, 'L', true);

                imprimirCabeceraTabla($pdf, $tipoInforme);

                $grupoActual = $grupo;
            }
        }

        if ($tipoInforme == 1) {
            $pdf->Cell(10, 6, $row['id'], 1, 0, 'C');
            $pdf->Cell(68, 6, mb_substr($row['nombre'] ?? '', 0, 48), 1, 0, 'L');
            $pdf->Cell(25, 6, mb_substr($row['documento_identidad'] ?? '', 0, 15), 1, 0, 'L');
            $pdf->Cell(63, 6, mb_substr($row['direccion'] ?? '', 0, 52), 1, 0, 'L');
            $pdf->Cell(30, 6, mb_substr($zona, 0, 22), 1, 1, 'L');
        } else {
            $pdf->Cell(10, 6, $row['id'], 1, 0, 'C');
            $pdf->Cell(58, 6, mb_substr($row['nombre'] ?? '', 0, 42), 1, 0, 'L');
            $pdf->Cell(24, 6, mb_substr($row['documento_identidad'] ?? '', 0, 15), 1, 0, 'L');
            $pdf->Cell(48, 6, mb_substr($row['direccion'] ?? '', 0, 38), 1, 0, 'L');
            $pdf->Cell(27, 6, mb_substr($zona, 0, 20), 1, 0, 'L');
            $pdf->Cell(29, 6, mb_substr($subzona, 0, 20), 1, 1, 'L');
        }

        $contadorGrupo++;
        $totalGeneral++;
    }

    if (($tipoInforme == 1 || $tipoInforme == 2) && $idFiltro == 0 && $grupoActual !== '') {
        $pdf->SetFont('helvetica', 'B', 7);
        $pdf->Cell(196, 6, 'TOTAL DEL GRUPO: ' . $contadorGrupo, 1, 1, 'R');
    }

    $pdf->Ln(3);
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(0, 6, 'TOTAL CLIENTES: ' . $totalGeneral, 0, 1, 'R');

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

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

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

    error_log("ERROR informe_clientes: " . $e->getMessage());

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