<?php
/**
 * ASISMA CRM - Modelo Servicio
 * Servicios con planes configurables (cotización estilo asisma_ops).
 * El servicio cuelga de una MARCA; la vertical se deriva de la marca.
 */
class Servicio extends Model {
    protected $table = 'servicios';

    /**
     * Detalle completo de un servicio: fila + planes (con características) + bonos.
     * $soloActivos limita planes/características/bonos a activos (para cotizar);
     * en false trae todo (para el configurador).
     */
    public function getDetalleCompleto($id, $soloActivos = false) {
        $servicio = $this->db->fetchOne(
            "SELECT s.*, m.nombre as marca_nombre, m.vertical_id, v.nombre as vertical_nombre
             FROM servicios s
             INNER JOIN marcas m ON s.marca_id = m.id
             INNER JOIN verticales v ON m.vertical_id = v.id
             WHERE s.id = :id",
            array('id' => $id)
        );
        if (!$servicio) return null;

        $filtroActivo = $soloActivos ? " AND activo = 1" : "";

        $planes = $this->db->fetchAll(
            "SELECT * FROM servicio_planes WHERE servicio_id = :sid{$filtroActivo} ORDER BY orden ASC, id ASC",
            array('sid' => $id)
        );
        foreach ($planes as $i => $plan) {
            $planes[$i]['caracteristicas'] = $this->db->fetchAll(
                "SELECT * FROM servicio_plan_caracteristicas WHERE plan_id = :pid{$filtroActivo} ORDER BY orden ASC, id ASC",
                array('pid' => $plan['id'])
            );
        }
        $servicio['planes'] = $planes;

        $servicio['bonos'] = $this->db->fetchAll(
            "SELECT * FROM servicio_bonos WHERE servicio_id = :sid{$filtroActivo} ORDER BY orden ASC, id ASC",
            array('sid' => $id)
        );

        return $servicio;
    }

    /**
     * Servicios cotizables con planes/características/bonos anidados. El
     * servicio vive en el maestro como PRODUCTO (servicios.producto_id):
     * Admin: los activos de la vertical del producto.
     * Franquiciado: los que puede VENDER (marca completa o producto suelto),
     * misma condición que AlcanceHelper::productos.
     */
    public function getServiciosParaCotizar($verticalId = null, $franquiciadoId = null) {
        $where  = array('s.activo = 1', 'm.activa = 1');
        $params = array();

        if ($verticalId) {
            $where[] = 'p.vertical_id = :vertical_id';
            $params['vertical_id'] = (int)$verticalId;
        }
        if ($franquiciadoId) {
            $where[] = '(p.marca_id IN (SELECT marca_id FROM franquiciado_marcas WHERE franquiciado_id = :fid)
                      OR p.id IN (SELECT producto_id FROM franquiciado_productos WHERE franquiciado_id = :fid2))';
            $params['fid']  = (int)$franquiciadoId;
            $params['fid2'] = (int)$franquiciadoId;
        }

        $filas = $this->db->fetchAll(
            "SELECT s.id FROM servicios s
             INNER JOIN marcas m ON s.marca_id = m.id
             INNER JOIN productos p ON s.producto_id = p.id AND p.activo = 1
             WHERE " . implode(' AND ', $where) . "
             ORDER BY s.nombre ASC",
            $params
        );

        $servicios = array();
        foreach ($filas as $fila) {
            $detalle = $this->getDetalleCompleto($fila['id'], true);
            if ($detalle && !empty($detalle['planes'])) {
                $servicios[] = $detalle;
            }
        }
        return $servicios;
    }

    /**
     * Listado para el configurador: servicio + marca + conteo de planes.
     */
    public function getListado($mostrarInactivos = false) {
        $filtro = $mostrarInactivos ? "" : " WHERE s.activo = 1";
        return $this->db->fetchAll(
            "SELECT s.*, m.nombre as marca_nombre, v.nombre as vertical_nombre,
                    (SELECT COUNT(*) FROM servicio_planes sp WHERE sp.servicio_id = s.id AND sp.activo = 1) as total_planes
             FROM servicios s
             INNER JOIN marcas m ON s.marca_id = m.id
             INNER JOIN verticales v ON m.vertical_id = v.id{$filtro}
             ORDER BY s.nombre ASC"
        );
    }
}
