<?php
/**
 * ASISMA CRM - Reportes Controller
 *
 * Indicadores del embudo, orígenes, ranking de franquiciados (admin),
 * tiempos de respuesta de asignación, cotizaciones y export CSV.
 */
class ReportesController extends Controller {

    public function index() {
        $db = Database::getInstance();
        $tenantCond = $this->getTenantFilter('l');

        // ── Embudo ────────────────────────────────────────────────────────────
        $leadsPorEstado = $db->fetchAll(
            "SELECT l.estado_embudo, COUNT(*) as cantidad
             FROM leads l
             WHERE {$tenantCond} AND l.activo = 1
             GROUP BY l.estado_embudo"
        );

        $leadsPorOrigen = $db->fetchAll(
            "SELECT l.origen, COUNT(*) as cantidad
             FROM leads l
             WHERE {$tenantCond} AND l.activo = 1
             GROUP BY l.origen ORDER BY cantidad DESC"
        );

        // ── KPIs generales ────────────────────────────────────────────────────
        $totales = $db->fetchOne(
            "SELECT COUNT(*) AS total,
                    SUM(l.estado_embudo = 'ganado') AS ganados,
                    SUM(l.estado_embudo = 'perdido') AS perdidos,
                    SUM(l.estado_embudo NOT IN ('ganado','perdido','invalido')) AS activos
             FROM leads l
             WHERE {$tenantCond} AND l.activo = 1"
        );
        $totalCerrados  = (int)$totales['ganados'] + (int)$totales['perdidos'];
        $tasaConversion = $totalCerrados > 0 ? round(((int)$totales['ganados'] / $totalCerrados) * 100, 1) : 0;

        // Tiempo medio de respuesta a asignaciones (aceptadas)
        $tenantCondAsig = $this->getTenantFilter('al');
        $respuesta = $db->fetchOne(
            "SELECT AVG(TIMESTAMPDIFF(SECOND, al.asignado_at, al.respondido_at)) AS promedio_seg,
                    SUM(al.estado = 'timeout') AS timeouts,
                    SUM(al.estado = 'aceptado') AS aceptadas,
                    COUNT(*) AS total
             FROM asignaciones_lead al
             WHERE {$tenantCondAsig} AND al.respondido_at IS NOT NULL"
        );

        // ── Cotizaciones ──────────────────────────────────────────────────────
        $tenantCondCot = $this->getTenantFilter('c');
        $cotizaciones = $db->fetchOne(
            "SELECT COUNT(*) AS total,
                    SUM(c.estado = 'aceptada') AS aceptadas,
                    SUM(CASE WHEN c.estado = 'aceptada' THEN c.total ELSE 0 END) AS monto_aceptado
             FROM cotizaciones c
             WHERE {$tenantCondCot} AND c.activo = 1"
        );

        // ── Serie mensual (últimos 6 meses) ──────────────────────────────────
        $serieMensual = $db->fetchAll(
            "SELECT DATE_FORMAT(l.created_at, '%Y-%m') AS mes,
                    COUNT(*) AS creados,
                    SUM(l.estado_embudo = 'ganado') AS ganados
             FROM leads l
             WHERE {$tenantCond} AND l.activo = 1
               AND l.created_at >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH)
             GROUP BY mes ORDER BY mes ASC"
        );

        // ── Ranking de franquiciados (solo admin) ────────────────────────────
        $rankingFranquiciados = array();
        if ($this->isAdmin()) {
            $rankingFranquiciados = $db->fetchAll(
                "SELECT f.id, ef.nombre_fantasia, r.nombre AS region_nombre, v.nombre AS vertical_nombre,
                        COUNT(l.id) AS total_leads,
                        SUM(l.estado_embudo = 'ganado') AS ganados,
                        SUM(l.estado_embudo = 'perdido') AS perdidos,
                        (SELECT AVG(TIMESTAMPDIFF(SECOND, al.asignado_at, al.respondido_at))
                         FROM asignaciones_lead al
                         WHERE al.franquiciado_id = f.id AND al.estado = 'aceptado') AS respuesta_seg
                 FROM franquiciados f
                 INNER JOIN empresas_franquiciados ef ON f.empresa_madre_id = ef.id
                 LEFT JOIN regiones r ON f.region_id = r.id
                 LEFT JOIN verticales v ON f.vertical_id = v.id
                 LEFT JOIN leads l ON l.franquiciado_id = f.id AND l.activo = 1
                 GROUP BY f.id, ef.nombre_fantasia, r.nombre, v.nombre
                 ORDER BY ganados DESC, total_leads DESC"
            );
        }

        $this->render('reportes/index', [
            'title'                => 'Reportes e Indicadores',
            'leadsPorEstado'       => $leadsPorEstado,
            'leadsPorOrigen'       => $leadsPorOrigen,
            'totales'              => $totales,
            'tasaConversion'       => $tasaConversion,
            'respuesta'            => $respuesta,
            'cotizaciones'         => $cotizaciones,
            'serieMensual'         => $serieMensual,
            'rankingFranquiciados' => $rankingFranquiciados
        ]);
    }

    /**
     * Export CSV de leads (respeta tenant). GET reportes/export
     */
    public function exportLeads() {
        $db = Database::getInstance();
        $tenantCond = $this->getTenantFilter('l');

        $leads = $db->fetchAll(
            "SELECT l.id, l.created_at, l.origen, l.estado_embudo, l.motivo_perdida,
                    c.nombre AS contacto, e.razon_social AS empresa,
                    r.nombre AS region, v.nombre AS vertical, m.nombre AS marca, p.nombre AS producto,
                    ef.nombre_fantasia AS franquiciado, u.nombre AS vendedor,
                    CASE WHEN l.datos_liberados = 1 THEN l.telefono_real ELSE l.telefono_enmascarado END AS telefono
             FROM leads l
             INNER JOIN contactos c ON l.contacto_id = c.id
             LEFT JOIN empresas e ON l.empresa_id = e.id
             LEFT JOIN regiones r ON l.region_id = r.id
             LEFT JOIN verticales v ON l.vertical_interes = v.id
             LEFT JOIN marcas m ON l.marca_interes = m.id
             LEFT JOIN productos p ON l.producto_interes = p.id
             LEFT JOIN franquiciados f ON l.franquiciado_id = f.id
             LEFT JOIN empresas_franquiciados ef ON f.empresa_madre_id = ef.id
             LEFT JOIN usuarios u ON l.usuario_asignado_id = u.id
             WHERE {$tenantCond} AND l.activo = 1
             ORDER BY l.id DESC"
        );

        $filename = 'leads_asisma_crm_' . date('Ymd_His') . '.csv';
        header('Content-Type: text/csv; charset=UTF-8');
        header('Content-Disposition: attachment; filename="' . $filename . '"');

        $out = fopen('php://output', 'w');
        // BOM para que Excel abra UTF-8 correctamente
        fwrite($out, "\xEF\xBB\xBF");

        fputcsv($out, array('ID', 'Fecha', 'Contacto', 'Empresa', 'Teléfono', 'Origen', 'Estado',
                            'Motivo Pérdida', 'Región', 'Vertical', 'Marca', 'Producto', 'Franquiciado', 'Vendedor'), ';');

        $estados = arr_estados_embudo();
        $origenes = arr_origenes_lead();
        $motivos = arr_motivos_perdida();

        foreach ($leads as $l) {
            fputcsv($out, array(
                $l['id'],
                $l['created_at'],
                $l['contacto'],
                $l['empresa'],
                $l['telefono'],
                isset($origenes[$l['origen']]) ? $origenes[$l['origen']] : $l['origen'],
                isset($estados[$l['estado_embudo']]) ? $estados[$l['estado_embudo']]['label'] : $l['estado_embudo'],
                $l['motivo_perdida'] ? (isset($motivos[$l['motivo_perdida']]) ? $motivos[$l['motivo_perdida']] : $l['motivo_perdida']) : '',
                $l['region'],
                $l['vertical'],
                $l['marca'],
                $l['producto'],
                $l['franquiciado'],
                $l['vendedor']
            ), ';');
        }

        fclose($out);
        exit;
    }
}
