<?php
/**
 * ASISMA CRM - Modelo Lead
 */
class Lead extends Model {
    protected $table = 'leads';

    public function getLeadsFiltered($page = 1, $limit = 20, $filters = array()) {
        $offset = ($page - 1) * $limit;
        $where  = array("l.activo = 1");
        $params = array();

        if (!SessionHelper::isAdmin()) {
            $where[]  = "l.franquiciado_id = :tenant_franquiciado_id";
            $params['tenant_franquiciado_id'] = SessionHelper::getFranquiciadoId();
        }

        if (!empty($filters['estado'])) {
            $where[]  = "l.estado_embudo = :estado";
            $params['estado'] = $filters['estado'];
        } else {
            // Sin filtro de estado, los PERDIDOS no se listan: solo aparecen
            // filtrando explícitamente por su card o el select de estado
            $where[]  = "l.estado_embudo != :estado_perdido";
            $params['estado_perdido'] = ESTADO_PERDIDO;
        }

        if (!empty($filters['origen'])) {
            $where[]  = "l.origen = :origen";
            $params['origen'] = $filters['origen'];
        }

        if (SessionHelper::isAdmin() && !empty($filters['franquiciado_id'])) {
            $where[]  = "l.franquiciado_id = :franquiciado_id";
            $params['franquiciado_id'] = $filters['franquiciado_id'];
        }

        // Filtros de segmentación: solo para el admin de la matriz
        if (SessionHelper::isAdmin()) {
            if (!empty($filters['vertical_id'])) {
                $where[]  = "l.vertical_interes = :f_vertical";
                $params['f_vertical'] = $filters['vertical_id'];
            }
            if (!empty($filters['marca_id'])) {
                $where[]  = "l.marca_interes = :f_marca";
                $params['f_marca'] = $filters['marca_id'];
            }
            if (!empty($filters['producto_id'])) {
                $where[]  = "l.producto_interes = :f_producto";
                $params['f_producto'] = $filters['producto_id'];
            }
        }

        if (!empty($filters['q'])) {
            // PDO sin emulación: cada placeholder debe ser único
            $where[]  = "(COALESCE(e.razon_social,'') LIKE :q1 OR COALESCE(e.rut,'') LIKE :q2 OR c.nombre LIKE :q3 OR l.telefono_real LIKE :q4 OR COALESCE(l.correo_real,'') LIKE :q5)";
            $comodin = "%" . $filters['q'] . "%";
            $params['q1'] = $comodin; $params['q2'] = $comodin; $params['q3'] = $comodin;
            $params['q4'] = $comodin; $params['q5'] = $comodin;
        }

        $whereSql = implode(" AND ", $where);

        $sql = "SELECT l.*,
                       COALESCE(e.razon_social, '') as empresa_razon_social,
                       COALESCE(e.rut, '') as empresa_rut,
                       c.nombre as contacto_nombre, c.telefono as contacto_telefono,
                       COALESCE(r.nombre, '') as region_nombre,
                       COALESCE(v.nombre, '') as vertical_nombre,
                       COALESCE(m.nombre, '') as marca_nombre,
                       COALESCE(p.nombre, '') as producto_nombre,
                       COALESCE(u.nombre, '') as usuario_asignado_nombre,
                       COALESCE(ef.nombre_fantasia, '') as franquiciado_nombre
                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 usuarios u   ON l.usuario_asignado_id = u.id
                LEFT JOIN franquiciados f   ON l.franquiciado_id = f.id
                LEFT JOIN empresas_franquiciados ef ON f.empresa_madre_id = ef.id
                WHERE {$whereSql}
                ORDER BY l.created_at DESC
                LIMIT :limit OFFSET :offset";

        $stmt = $this->db->getConnection()->prepare($sql);
        foreach ($params as $key => $val) {
            $stmt->bindValue($key, $val);
        }
        $stmt->bindValue('limit',  (int)$limit,  PDO::PARAM_INT);
        $stmt->bindValue('offset', (int)$offset, PDO::PARAM_INT);
        $stmt->execute();

        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

    public function getLeadsFilteredCount($filters = array()) {
        $where  = array("l.activo = 1");
        $params = array();

        if (!SessionHelper::isAdmin()) {
            $where[]  = "l.franquiciado_id = :tenant_franquiciado_id";
            $params['tenant_franquiciado_id'] = SessionHelper::getFranquiciadoId();
        }

        if (!empty($filters['estado'])) {
            $where[]  = "l.estado_embudo = :estado";
            $params['estado'] = $filters['estado'];
        } else {
            // Mismo criterio que getLeadsFiltered: sin filtro de estado no se
            // cuentan los perdidos (para que la paginación cuadre con la lista)
            $where[]  = "l.estado_embudo != :estado_perdido";
            $params['estado_perdido'] = ESTADO_PERDIDO;
        }

        if (!empty($filters['origen'])) {
            $where[]  = "l.origen = :origen";
            $params['origen'] = $filters['origen'];
        }

        if (SessionHelper::isAdmin() && !empty($filters['franquiciado_id'])) {
            $where[]  = "l.franquiciado_id = :franquiciado_id";
            $params['franquiciado_id'] = $filters['franquiciado_id'];
        }

        // Filtros de segmentación: solo para el admin de la matriz
        if (SessionHelper::isAdmin()) {
            if (!empty($filters['vertical_id'])) {
                $where[]  = "l.vertical_interes = :f_vertical";
                $params['f_vertical'] = $filters['vertical_id'];
            }
            if (!empty($filters['marca_id'])) {
                $where[]  = "l.marca_interes = :f_marca";
                $params['f_marca'] = $filters['marca_id'];
            }
            if (!empty($filters['producto_id'])) {
                $where[]  = "l.producto_interes = :f_producto";
                $params['f_producto'] = $filters['producto_id'];
            }
        }

        if (!empty($filters['q'])) {
            // PDO sin emulación: cada placeholder debe ser único
            $where[]  = "(COALESCE(e.razon_social,'') LIKE :q1 OR COALESCE(e.rut,'') LIKE :q2 OR c.nombre LIKE :q3 OR l.telefono_real LIKE :q4 OR COALESCE(l.correo_real,'') LIKE :q5)";
            $comodin = "%" . $filters['q'] . "%";
            $params['q1'] = $comodin; $params['q2'] = $comodin; $params['q3'] = $comodin;
            $params['q4'] = $comodin; $params['q5'] = $comodin;
        }

        $whereSql = implode(" AND ", $where);

        $sql = "SELECT COUNT(*) as total
                FROM leads l
                INNER JOIN contactos c ON l.contacto_id = c.id
                LEFT JOIN empresas e   ON l.empresa_id = e.id
                WHERE {$whereSql}";

        $res = $this->db->fetchOne($sql, $params);
        return (int)(isset($res['total']) ? $res['total'] : 0);
    }

    /**
     * Conteo de leads POR ESTADO para los contadores del listado. Aplica los
     * mismos filtros del listado EXCEPTO el propio filtro de estado (los
     * contadores muestran el panorama completo del embudo con esos filtros).
     * Devuelve array estado_embudo => total.
     */
    public function getConteoPorEstado($filters = array()) {
        $where  = array("l.activo = 1");
        $params = array();

        if (!SessionHelper::isAdmin()) {
            $where[]  = "l.franquiciado_id = :tenant_franquiciado_id";
            $params['tenant_franquiciado_id'] = SessionHelper::getFranquiciadoId();
        }

        if (!empty($filters['origen'])) {
            $where[]  = "l.origen = :origen";
            $params['origen'] = $filters['origen'];
        }

        if (SessionHelper::isAdmin() && !empty($filters['franquiciado_id'])) {
            $where[]  = "l.franquiciado_id = :franquiciado_id";
            $params['franquiciado_id'] = $filters['franquiciado_id'];
        }

        // Filtros de segmentación: solo para el admin de la matriz
        if (SessionHelper::isAdmin()) {
            if (!empty($filters['vertical_id'])) {
                $where[]  = "l.vertical_interes = :f_vertical";
                $params['f_vertical'] = $filters['vertical_id'];
            }
            if (!empty($filters['marca_id'])) {
                $where[]  = "l.marca_interes = :f_marca";
                $params['f_marca'] = $filters['marca_id'];
            }
            if (!empty($filters['producto_id'])) {
                $where[]  = "l.producto_interes = :f_producto";
                $params['f_producto'] = $filters['producto_id'];
            }
        }

        if (!empty($filters['q'])) {
            // PDO sin emulación: cada placeholder debe ser único
            $where[]  = "(COALESCE(e.razon_social,'') LIKE :q1 OR COALESCE(e.rut,'') LIKE :q2 OR c.nombre LIKE :q3 OR l.telefono_real LIKE :q4 OR COALESCE(l.correo_real,'') LIKE :q5)";
            $comodin = "%" . $filters['q'] . "%";
            $params['q1'] = $comodin; $params['q2'] = $comodin; $params['q3'] = $comodin;
            $params['q4'] = $comodin; $params['q5'] = $comodin;
        }

        $whereSql = implode(" AND ", $where);

        $filas = $this->db->fetchAll(
            "SELECT l.estado_embudo, COUNT(*) as total
             FROM leads l
             INNER JOIN contactos c ON l.contacto_id = c.id
             LEFT JOIN empresas e   ON l.empresa_id = e.id
             WHERE {$whereSql}
             GROUP BY l.estado_embudo",
            $params
        );

        $conteo = array();
        foreach ($filas as $fila) {
            $conteo[$fila['estado_embudo']] = (int)$fila['total'];
        }
        return $conteo;
    }

    public function getLeadDetails($id) {
        $where  = "l.id = :id AND l.activo = 1";
        $params = array('id' => $id);

        if (!SessionHelper::isAdmin()) {
            $where .= " AND l.franquiciado_id = :tenant_franquiciado_id";
            $params['tenant_franquiciado_id'] = SessionHelper::getFranquiciadoId();
        }

        $sql = "SELECT l.*,
                       COALESCE(e.razon_social, '') as empresa_razon_social,
                       COALESCE(e.rut, '') as empresa_rut,
                       COALESCE(e.giro, '') as empresa_giro,
                       COALESCE(e.direccion, '') as empresa_direccion,
                       COALESCE(e.sitio_web, '') as empresa_sitio_web,
                       COALESCE(e.email, '') as empresa_email,
                       COALESCE(e.telefono, '') as empresa_telefono,
                       c.nombre as contacto_nombre, c.telefono as contacto_telefono,
                       COALESCE(c.correo, '') as contacto_correo,
                       COALESCE(c.cargo, '') as contacto_cargo,
                       COALESCE(r.nombre, '') as region_nombre,
                       COALESCE(v.nombre, '') as vertical_nombre,
                       COALESCE(m.nombre, '') as marca_nombre,
                       COALESCE(p.nombre, '') as producto_nombre,
                       COALESCE(u.nombre, '') as usuario_asignado_nombre,
                       COALESCE(ef.nombre_fantasia, '') as franquiciado_nombre,
                       COALESCE(ef.api_facturacion_url, '') as api_facturacion_url,
                       COALESCE(ef.api_key_facturacion, '') as api_key_facturacion
                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 usuarios u   ON l.usuario_asignado_id = u.id
                LEFT JOIN franquiciados f   ON l.franquiciado_id = f.id
                LEFT JOIN empresas_franquiciados ef ON f.empresa_madre_id = ef.id
                WHERE {$where} LIMIT 1";

        return $this->db->fetchOne($sql, $params);
    }
}
