<?php
/**
 * ASISMA CRM - Modelo Cotización
 */
class Cotizacion extends Model {
    protected $table = 'cotizaciones';

    public function getByHash($hash) {
        $sql = "SELECT c.*,
                       l.estado_embudo as lead_estado, l.telefono_real as lead_telefono, l.correo_real as lead_correo,
                       e.razon_social as cliente_razon_social, e.rut as cliente_rut, e.giro as cliente_giro, e.direccion as cliente_direccion,
                       con.nombre as cliente_contacto_nombre, con.correo as cliente_contacto_correo,
                       u.nombre as ejecutivo_nombre, u.email as ejecutivo_email, u.telefono as ejecutivo_telefono,
                       ef.nombre_fantasia as franquiciado_nombre, ef.email as franquiciado_email,
                       ef.telefono as franquiciado_telefono, ef.direccion as franquiciado_direccion
                FROM cotizaciones c
                INNER JOIN leads l   ON c.lead_id = l.id
                LEFT JOIN empresas e ON l.empresa_id = e.id
                INNER JOIN contactos con ON l.contacto_id = con.id
                INNER JOIN usuarios u ON c.usuario_id = u.id
                INNER JOIN franquiciados f ON c.franquiciado_id = f.id
                INNER JOIN empresas_franquiciados ef ON f.empresa_madre_id = ef.id
                WHERE c.hash = :hash AND c.activo = 1 LIMIT 1";

        return $this->db->fetchOne($sql, array('hash' => $hash));
    }

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

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

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

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

        if (!empty($filters['q'])) {
            $where[]  = "(e.razon_social LIKE :q OR e.rut LIKE :q OR con.nombre LIKE :q OR u.nombre LIKE :q)";
            $params['q'] = "%" . $filters['q'] . "%";
        }

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

        $sql = "SELECT c.*,
                       e.razon_social as cliente_razon_social, e.rut as cliente_rut,
                       con.nombre as cliente_contacto,
                       u.nombre as ejecutivo_nombre,
                       ef.nombre_fantasia as franquiciado_nombre
                FROM cotizaciones c
                INNER JOIN leads l   ON c.lead_id = l.id
                LEFT JOIN empresas e ON l.empresa_id = e.id
                INNER JOIN contactos con ON l.contacto_id = con.id
                INNER JOIN usuarios u ON c.usuario_id = u.id
                INNER JOIN franquiciados f ON c.franquiciado_id = f.id
                INNER JOIN empresas_franquiciados ef ON f.empresa_madre_id = ef.id
                WHERE {$whereSql}
                ORDER BY c.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 getQuotesFilteredCount($filters = array()) {
        $where  = array("c.activo = 1");
        $params = array();

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

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

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

        if (!empty($filters['q'])) {
            $where[]  = "(e.razon_social LIKE :q OR e.rut LIKE :q OR con.nombre LIKE :q OR u.nombre LIKE :q)";
            $params['q'] = "%" . $filters['q'] . "%";
        }

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

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

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