<?php
/**
 * ASISMA CRM - Servicios Controller
 * Configurador de servicios con planes (cotización estilo asisma_ops).
 * SOLO el superadmin de la matriz configura; franquiciados los usan al cotizar.
 */
class ServiciosController extends Controller {

    private $servicioModel;

    public function __construct() {
        $this->servicioModel = new Servicio();
    }

    /** Guard común: todo este módulo es solo del superadmin. */
    private function exigirAdmin() {
        if (!$this->isAdmin()) {
            $this->json(array('success' => false, 'message' => 'Solo el administrador de la matriz puede configurar servicios.'), 403);
        }
    }

    // El listado propio desapareció: los servicios se administran desde el
    // maestro de PRODUCTOS (un servicio = un producto tipo servicio). Estas
    // acciones quedan como API del editor embebido en esa pantalla.

    /** Detalle completo en JSON para pintar el editor. */
    public function detalle() {
        $this->exigirAdmin();
        $id = intval(isset($_GET['id']) ? $_GET['id'] : 0);
        $servicio = $id ? $this->servicioModel->getDetalleCompleto($id) : null;
        if (!$servicio) {
            $this->json(array('success' => false, 'message' => 'Servicio no encontrado.'), 404);
        }
        $this->json(array('success' => true, 'servicio' => $servicio));
    }

    /** Edita el branding/datos del servicio. La CREACIÓN es desde Productos. */
    public function guardar() {
        $this->exigirAdmin();
        $id      = intval(isset($_POST['id']) ? $_POST['id'] : 0);
        $marcaId = intval(isset($_POST['marca_id']) ? $_POST['marca_id'] : 0);
        $nombre  = trim(isset($_POST['nombre']) ? $_POST['nombre'] : '');

        if (!$id) {
            $this->json(array('success' => false, 'message' => 'Los servicios se crean desde la pantalla de Productos (nuevo producto de tipo Servicio).'));
        }

        $db = Database::getInstance();

        // El MAESTRO es el producto: si el servicio tiene producto enlazado,
        // nombre y marca se fuerzan desde ahí (se ignora lo que venga en el POST)
        $filaServicio = $db->fetchOne("SELECT producto_id FROM servicios WHERE id = :id", array('id' => $id));
        if ($filaServicio && $filaServicio['producto_id']) {
            $productoMaestro = $db->fetchOne("SELECT nombre, marca_id, descripcion FROM productos WHERE id = :id", array('id' => $filaServicio['producto_id']));
            if ($productoMaestro) {
                $nombre  = $productoMaestro['nombre'];
                $marcaId = (int)$productoMaestro['marca_id'];
            }
        }

        if ($nombre === '' || !$marcaId) {
            $this->json(array('success' => false, 'message' => 'El nombre y la marca son requeridos.'));
        }
        if (!$db->fetchOne("SELECT id FROM marcas WHERE id = :id AND activa = 1", array('id' => $marcaId))) {
            $this->json(array('success' => false, 'message' => 'La marca seleccionada no existe o está inactiva.'));
        }

        // Párrafos de presentación llegan como textarea (un párrafo por línea en blanco)
        $parrafosTexto = trim(isset($_POST['parrafos_presentacion']) ? $_POST['parrafos_presentacion'] : '');
        $parrafos = array();
        if ($parrafosTexto !== '') {
            foreach (preg_split('/\r?\n\s*\r?\n/', $parrafosTexto) as $parrafo) {
                $parrafo = trim($parrafo);
                if ($parrafo !== '') $parrafos[] = $parrafo;
            }
        }

        // Garantía: cita + condiciones (una por línea)
        $garantia = array(
            'cita'        => trim(isset($_POST['garantia_cita']) ? $_POST['garantia_cita'] : ''),
            'condiciones' => array(),
        );
        $condGarantia = trim(isset($_POST['garantia_condiciones']) ? $_POST['garantia_condiciones'] : '');
        if ($condGarantia !== '') {
            foreach (preg_split('/\r?\n/', $condGarantia) as $linea) {
                $linea = trim($linea);
                if ($linea !== '') $garantia['condiciones'][] = $linea;
            }
        }

        $campoTexto = function($clave) {
            $valor = trim(isset($_POST[$clave]) ? $_POST[$clave] : '');
            return $valor === '' ? null : $valor;
        };

        // El servicio guarda SOLO su contenido de oferta. La identidad
        // corporativa (logo, colores, transferencia, condiciones, diseño)
        // vive en la MARCA (decisión 22-07) y se edita en Catálogo → Marcas.
        $datos = array(
            'marca_id'              => $marcaId,
            'nombre'                => $nombre,
            'descripcion'           => $campoTexto('descripcion'),
            'rotulo_cliente'        => $campoTexto('rotulo_cliente'),
            'parrafos_presentacion' => $parrafos ? json_encode($parrafos, JSON_UNESCAPED_UNICODE) : null,
            'frase_destacada'       => $campoTexto('frase_destacada'),
            'titulo_bonos'          => $campoTexto('titulo_bonos'),
            'garantia_dias'         => intval(isset($_POST['garantia_dias']) ? $_POST['garantia_dias'] : 30),
            'garantia_texto'        => $garantia['cita'] !== '' ? json_encode($garantia, JSON_UNESCAPED_UNICODE) : null,
        );

        $anterior = $this->servicioModel->getById($id);
        if (!$anterior) {
            $this->json(array('success' => false, 'message' => 'Servicio no encontrado.'));
        }
        $this->servicioModel->update($id, $datos);
        AuditHelper::log('guardar_servicio', 'servicios', $id,
            array('nombre' => $anterior['nombre'], 'marca_id' => $anterior['marca_id']),
            array('nombre' => $nombre, 'marca_id' => $marcaId));
        $this->json(array('success' => true, 'message' => 'Servicio actualizado.', 'id' => $id));
    }

    /**
     * Vista previa en vivo del documento (AJAX POST desde el modal de
     * Documento/Branding, SIN guardar nada). Renderiza la MISMA plantilla que
     * usa la cotización pública/PDF (cotizaciones/publica_servicio) con el
     * branding tal como está en el formulario en ese instante + datos de
     * cliente y plan de MUESTRA (el primer plan real del servicio si existe,
     * o valores ficticios si aún no tiene planes configurados).
     */
    public function previsualizar() {
        $this->exigirAdmin();
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            http_response_code(405);
            echo '<div style="font-family:sans-serif;padding:3rem;text-align:center;color:#94a3b8">Método no soportado.</div>';
            exit;
        }

        $id = intval(isset($_POST['id']) ? $_POST['id'] : 0);
        $servicioReal = $id ? $this->servicioModel->getDetalleCompleto($id, true) : null;

        // Mismo parseo de párrafos/garantía/condiciones que guardar()
        $parrafosTexto = trim(isset($_POST['parrafos_presentacion']) ? $_POST['parrafos_presentacion'] : '');
        $parrafos = array();
        if ($parrafosTexto !== '') {
            foreach (preg_split('/\r?\n\s*\r?\n/', $parrafosTexto) as $parrafo) {
                $parrafo = trim($parrafo);
                if ($parrafo !== '') $parrafos[] = $parrafo;
            }
        }
        $garantia = array('cita' => trim(isset($_POST['garantia_cita']) ? $_POST['garantia_cita'] : ''), 'condiciones' => array());
        $condGarantia = trim(isset($_POST['garantia_condiciones']) ? $_POST['garantia_condiciones'] : '');
        if ($condGarantia !== '') {
            foreach (preg_split('/\r?\n/', $condGarantia) as $linea) {
                $linea = trim($linea);
                if ($linea !== '') $garantia['condiciones'][] = $linea;
            }
        }
        $campoTexto = function($clave) {
            $valor = trim(isset($_POST[$clave]) ? $_POST[$clave] : '');
            return $valor === '' ? null : $valor;
        };

        // Contenido de la oferta desde el POST (lo que se está editando);
        // la identidad corporativa y el diseño llegan de la MARCA guardada.
        $marcaId = $servicioReal ? (int)$servicioReal['marca_id'] : 0;
        $servicioCfg = array(
            'id'                    => $id,
            'producto_id'           => $servicioReal ? $servicioReal['producto_id'] : null,
            'marca_id'              => $marcaId,
            'nombre'                => $servicioReal ? $servicioReal['nombre'] : 'Mi Servicio',
            'rotulo_cliente'        => $campoTexto('rotulo_cliente'),
            'parrafos_presentacion' => $parrafos ? json_encode($parrafos, JSON_UNESCAPED_UNICODE) : null,
            'frase_destacada'       => $campoTexto('frase_destacada'),
            'titulo_bonos'          => $campoTexto('titulo_bonos'),
            'garantia_dias'         => intval(isset($_POST['garantia_dias']) ? $_POST['garantia_dias'] : 30),
            'garantia_texto'        => $garantia['cita'] !== '' ? json_encode($garantia, JSON_UNESCAPED_UNICODE) : null,
        );

        // Plan de muestra: el primero activo del servicio real (precios y
        // características reales) o, si aún no configuró ninguno, valores
        // ficticios para poder mostrar igual el documento completo.
        $planMuestra = ($servicioReal && !empty($servicioReal['planes'])) ? $servicioReal['planes'][0] : null;
        $moneda = $planMuestra ? $planMuestra['moneda'] : 'UF';
        $esUf = $moneda === 'UF';
        $valorUf = $esUf ? UfHelper::valorUf() : 0.0;

        $precioInicial = $planMuestra && $planMuestra['precio_inicial'] !== null ? (float)$planMuestra['precio_inicial'] : ($esUf ? 9.9 : 350000.0);
        $precioMensual = $planMuestra && $planMuestra['precio_mensual'] !== null ? (float)$planMuestra['precio_mensual'] : null;

        $caracteristicas = array();
        if ($planMuestra && !empty($planMuestra['caracteristicas'])) {
            foreach ($planMuestra['caracteristicas'] as $c) {
                $caracteristicas[] = array('titulo' => $c['titulo'], 'desc' => (string)$c['descripcion']);
            }
        }
        $bonos = array();
        if ($servicioReal && !empty($servicioReal['bonos'])) {
            foreach ($servicioReal['bonos'] as $b) {
                if ($b['incluido_por_defecto']) $bonos[] = array('titulo' => $b['titulo'], 'desc' => (string)$b['descripcion']);
            }
        }

        $factorClp = $esUf ? $valorUf : 1;
        $precioInicialClp = round($precioInicial * $factorClp);
        $precioMensualClp = $precioMensual !== null ? round($precioMensual * $factorClp) : 0;

        $itemPlan = array(
            'clase'              => 'servicio_plan',
            'servicio_id'        => $id,
            'producto_id'        => $servicioCfg['producto_id'],
            'servicio_nombre'    => $servicioCfg['nombre'],
            'plan_id'            => $planMuestra ? (int)$planMuestra['id'] : 0,
            'plan_codigo'        => $planMuestra ? $planMuestra['codigo'] : 'muestra',
            'plan_nombre'        => $planMuestra ? $planMuestra['nombre'] : 'Plan de ejemplo',
            'moneda'             => $moneda,
            'precio_inicial'     => $precioInicial,
            'precio_mensual'     => $precioMensual,
            'precio_inicial_clp' => $precioInicialClp,
            'precio_mensual_clp' => $precioMensualClp,
            'caracteristicas'    => $caracteristicas,
            'bonos'              => $bonos,
        );

        $subtotal = $precioInicialClp;
        $totalFinal = round($subtotal * 1.19);

        $db = Database::getInstance();
        $filaVence = $db->fetchOne("SELECT DATE_ADD(NOW(), INTERVAL 48 HOUR) as vence");

        $cotizFake = array(
            'id'                      => 0,
            'hash'                    => 'preview',
            'estado'                  => 'enviada',
            'tipo'                    => 'servicios',
            'productos_json'          => json_encode(array($itemPlan), JSON_UNESCAPED_UNICODE),
            'subtotal'                => $subtotal,
            'impuesto_pct'            => 19,
            'moneda'                  => 'CLP',
            'valor_uf'                => $valorUf,
            'descuento_valor'         => 0,
            'descuento_tipo'          => 'fijo',
            'vencimiento_at'          => $filaVence['vence'],
            'created_at'              => date('Y-m-d H:i:s'),
            'franquiciado_nombre'     => $servicioCfg['nombre'],
            'cliente_razon_social'    => 'Empresa Demo SpA',
            'cliente_rut'             => '77.222.222-2',
            'cliente_contacto_nombre' => 'Juan Pérez',
            'cliente_contacto_correo' => 'contacto@empresademo.cl',
            'ejecutivo_nombre'        => 'Ejecutivo de ejemplo',
            'ejecutivo_telefono'      => '+56 9 0000 0000',
            'ejecutivo_email'         => 'ejecutivo@asisma.cl',
            'notas'                   => '',
            'total'                   => $totalFinal,
            'cuotas'                  => 1,
        );

        // Plantilla ornamentada solo si el DISEÑO de la marca es 'moderno';
        // en cualquier otro caso, el documento unificado con su diseño.
        if (IdentidadHelper::disenoDeMarca($marcaId) === 'moderno') {
            $this->renderPartial('cotizaciones/publica_servicio', array(
                'cotiz'    => $cotizFake,
                'servicio' => $servicioCfg
            ));
            return;
        }
        $this->renderPartial('cotizaciones/publica', array(
            'cotiz'            => $cotizFake,
            'servicio'         => $servicioCfg,
            'identidad'        => IdentidadHelper::resolver($marcaId, $servicioCfg),
            'diseno'           => IdentidadHelper::disenoDeMarca($marcaId),
            'condicionesMarca' => IdentidadHelper::condicionesDeMarca($marcaId),
            'flowActivo'       => false
        ));
    }

    public function toggle() {
        $this->exigirAdmin();
        $id = intval(isset($_POST['id']) ? $_POST['id'] : 0);
        $servicio = $id ? $this->servicioModel->getById($id) : null;
        if (!$servicio) {
            $this->json(array('success' => false, 'message' => 'Servicio no encontrado.'));
        }
        $nuevo = $servicio['activo'] ? 0 : 1;
        $this->servicioModel->update($id, array('activo' => $nuevo));
        AuditHelper::log('toggle_servicio', 'servicios', $id,
            array('activo' => $servicio['activo']), array('activo' => $nuevo));
        $this->json(array('success' => true, 'message' => $nuevo ? 'Servicio activado.' : 'Servicio desactivado.', 'nuevo_estado' => $nuevo));
    }

    // =====================================================================
    // PLANES
    // =====================================================================

    public function planGuardar() {
        $this->exigirAdmin();
        $id         = intval(isset($_POST['id']) ? $_POST['id'] : 0);
        $servicioId = intval(isset($_POST['servicio_id']) ? $_POST['servicio_id'] : 0);
        $nombre     = trim(isset($_POST['nombre']) ? $_POST['nombre'] : '');
        $codigo     = trim(isset($_POST['codigo']) ? $_POST['codigo'] : '');
        $moneda     = isset($_POST['moneda']) && $_POST['moneda'] === 'CLP' ? 'CLP' : 'UF';

        $aDecimal = function($clave) {
            $valor = trim(isset($_POST[$clave]) ? $_POST[$clave] : '');
            if ($valor === '') return null;
            $valor = str_replace(',', '.', $valor);
            return is_numeric($valor) ? (float)$valor : null;
        };
        $precioInicial       = $aDecimal('precio_inicial');
        $precioMensual       = $aDecimal('precio_mensual');
        $precioInicialMinimo = $aDecimal('precio_inicial_minimo');
        $precioMensualMinimo = $aDecimal('precio_mensual_minimo');
        $precioInicialMaximo = $aDecimal('precio_inicial_maximo');
        $precioMensualMaximo = $aDecimal('precio_mensual_maximo');

        if ($nombre === '' || !$servicioId) {
            $this->json(array('success' => false, 'message' => 'El nombre del plan y el servicio son requeridos.'));
        }
        if ($precioInicial === null && $precioMensual === null) {
            $this->json(array('success' => false, 'message' => 'El plan debe tener al menos un precio (inicial o mensual).'));
        }
        if ($precioInicialMinimo !== null && $precioInicial !== null && $precioInicialMinimo > $precioInicial) {
            $this->json(array('success' => false, 'message' => 'El mínimo del precio inicial no puede superar el precio por defecto.'));
        }
        if ($precioMensualMinimo !== null && $precioMensual !== null && $precioMensualMinimo > $precioMensual) {
            $this->json(array('success' => false, 'message' => 'El mínimo del precio mensual no puede superar el precio por defecto.'));
        }
        if ($precioInicialMaximo !== null && $precioInicial !== null && $precioInicialMaximo < $precioInicial) {
            $this->json(array('success' => false, 'message' => 'El máximo del precio inicial no puede ser menor al precio por defecto.'));
        }
        if ($precioMensualMaximo !== null && $precioMensual !== null && $precioMensualMaximo < $precioMensual) {
            $this->json(array('success' => false, 'message' => 'El máximo del precio mensual no puede ser menor al precio por defecto.'));
        }
        if ($precioInicialMaximo !== null && $precioInicialMinimo !== null && $precioInicialMaximo < $precioInicialMinimo) {
            $this->json(array('success' => false, 'message' => 'El máximo del precio inicial no puede ser menor al mínimo.'));
        }
        if ($precioMensualMaximo !== null && $precioMensualMinimo !== null && $precioMensualMaximo < $precioMensualMinimo) {
            $this->json(array('success' => false, 'message' => 'El máximo del precio mensual no puede ser menor al mínimo.'));
        }
        if (!$this->servicioModel->getById($servicioId)) {
            $this->json(array('success' => false, 'message' => 'Servicio no encontrado.'));
        }
        if ($codigo === '') {
            // Código interno derivado del nombre (referencia estilo start/medio/pro)
            $codigo = substr(strtolower(preg_replace('/[^a-z0-9]+/i', '_', $nombre)), 0, 30);
        }

        $db = Database::getInstance();
        $datos = array(
            'servicio_id'           => $servicioId,
            'codigo'                => $codigo,
            'nombre'                => $nombre,
            'moneda'                => $moneda,
            'precio_inicial'        => $precioInicial,
            'precio_mensual'        => $precioMensual,
            'precio_inicial_minimo' => $precioInicialMinimo,
            'precio_mensual_minimo' => $precioMensualMinimo,
            'precio_inicial_maximo' => $precioInicialMaximo,
            'precio_mensual_maximo' => $precioMensualMaximo,
            'orden'                 => intval(isset($_POST['orden']) ? $_POST['orden'] : 0),
        );

        if ($id) {
            $anterior = $db->fetchOne("SELECT * FROM servicio_planes WHERE id = :id", array('id' => $id));
            if (!$anterior || (int)$anterior['servicio_id'] !== $servicioId) {
                $this->json(array('success' => false, 'message' => 'Plan no encontrado en este servicio.'));
            }
            $db->update('servicio_planes', $datos, 'id = :id', array(':id' => $id));
            AuditHelper::log('guardar_plan_servicio', 'servicio_planes', $id,
                array('nombre' => $anterior['nombre'], 'precio_inicial' => $anterior['precio_inicial'], 'precio_mensual' => $anterior['precio_mensual']),
                array('nombre' => $nombre, 'precio_inicial' => $precioInicial, 'precio_mensual' => $precioMensual));
            $this->json(array('success' => true, 'message' => 'Plan actualizado.', 'id' => $id));
        } else {
            $datos['activo'] = 1;
            $id = $db->insert('servicio_planes', $datos);
            AuditHelper::log('guardar_plan_servicio', 'servicio_planes', $id, null,
                array('nombre' => $nombre, 'precio_inicial' => $precioInicial, 'precio_mensual' => $precioMensual));
            $this->json(array('success' => true, 'message' => 'Plan creado.', 'id' => $id));
        }
    }

    public function planToggle() {
        $this->exigirAdmin();
        $id = intval(isset($_POST['id']) ? $_POST['id'] : 0);
        $db = Database::getInstance();
        $plan = $id ? $db->fetchOne("SELECT * FROM servicio_planes WHERE id = :id", array('id' => $id)) : null;
        if (!$plan) {
            $this->json(array('success' => false, 'message' => 'Plan no encontrado.'));
        }
        $nuevo = $plan['activo'] ? 0 : 1;
        $db->update('servicio_planes', array('activo' => $nuevo), 'id = :id', array(':id' => $id));
        AuditHelper::log('toggle_plan_servicio', 'servicio_planes', $id,
            array('activo' => $plan['activo']), array('activo' => $nuevo));
        $this->json(array('success' => true, 'message' => $nuevo ? 'Plan activado.' : 'Plan desactivado.', 'nuevo_estado' => $nuevo));
    }

    // =====================================================================
    // CARACTERÍSTICAS (por plan)
    // =====================================================================

    public function caracteristicaGuardar() {
        $this->exigirAdmin();
        $id     = intval(isset($_POST['id']) ? $_POST['id'] : 0);
        $planId = intval(isset($_POST['plan_id']) ? $_POST['plan_id'] : 0);
        $titulo = trim(isset($_POST['titulo']) ? $_POST['titulo'] : '');

        if ($titulo === '' || !$planId) {
            $this->json(array('success' => false, 'message' => 'El título y el plan son requeridos.'));
        }
        $db = Database::getInstance();
        if (!$db->fetchOne("SELECT id FROM servicio_planes WHERE id = :id", array('id' => $planId))) {
            $this->json(array('success' => false, 'message' => 'Plan no encontrado.'));
        }
        $datos = array(
            'plan_id'     => $planId,
            'titulo'      => $titulo,
            'descripcion' => trim(isset($_POST['descripcion']) ? $_POST['descripcion'] : ''),
            'orden'       => intval(isset($_POST['orden']) ? $_POST['orden'] : 0),
        );
        if ($id) {
            $db->update('servicio_plan_caracteristicas', $datos, 'id = :id', array(':id' => $id));
            AuditHelper::log('guardar_caracteristica_plan', 'servicio_plan_caracteristicas', $id, null, array('titulo' => $titulo));
            $this->json(array('success' => true, 'message' => 'Característica actualizada.', 'id' => $id));
        } else {
            $datos['activo'] = 1;
            $id = $db->insert('servicio_plan_caracteristicas', $datos);
            AuditHelper::log('guardar_caracteristica_plan', 'servicio_plan_caracteristicas', $id, null, array('titulo' => $titulo));
            $this->json(array('success' => true, 'message' => 'Característica agregada.', 'id' => $id));
        }
    }

    public function caracteristicaEliminar() {
        $this->exigirAdmin();
        $id = intval(isset($_POST['id']) ? $_POST['id'] : 0);
        $db = Database::getInstance();
        $fila = $id ? $db->fetchOne("SELECT * FROM servicio_plan_caracteristicas WHERE id = :id", array('id' => $id)) : null;
        if (!$fila) {
            $this->json(array('success' => false, 'message' => 'Característica no encontrada.'));
        }
        $db->delete('servicio_plan_caracteristicas', 'id = :id', array('id' => $id));
        AuditHelper::log('eliminar_caracteristica_plan', 'servicio_plan_caracteristicas', $id,
            array('titulo' => $fila['titulo']), null);
        $this->json(array('success' => true, 'message' => 'Característica eliminada.'));
    }

    // =====================================================================
    // BONOS (por servicio)
    // =====================================================================

    public function bonoGuardar() {
        $this->exigirAdmin();
        $id         = intval(isset($_POST['id']) ? $_POST['id'] : 0);
        $servicioId = intval(isset($_POST['servicio_id']) ? $_POST['servicio_id'] : 0);
        $titulo     = trim(isset($_POST['titulo']) ? $_POST['titulo'] : '');

        if ($titulo === '' || !$servicioId) {
            $this->json(array('success' => false, 'message' => 'El título y el servicio son requeridos.'));
        }
        if (!$this->servicioModel->getById($servicioId)) {
            $this->json(array('success' => false, 'message' => 'Servicio no encontrado.'));
        }
        $db = Database::getInstance();
        $datos = array(
            'servicio_id'          => $servicioId,
            'titulo'               => $titulo,
            'descripcion'          => trim(isset($_POST['descripcion']) ? $_POST['descripcion'] : ''),
            'incluido_por_defecto' => !empty($_POST['incluido_por_defecto']) ? 1 : 0,
            'orden'                => intval(isset($_POST['orden']) ? $_POST['orden'] : 0),
        );
        if ($id) {
            $db->update('servicio_bonos', $datos, 'id = :id', array(':id' => $id));
            AuditHelper::log('guardar_bono_servicio', 'servicio_bonos', $id, null, array('titulo' => $titulo));
            $this->json(array('success' => true, 'message' => 'Bono actualizado.', 'id' => $id));
        } else {
            $datos['activo'] = 1;
            $id = $db->insert('servicio_bonos', $datos);
            AuditHelper::log('guardar_bono_servicio', 'servicio_bonos', $id, null, array('titulo' => $titulo));
            $this->json(array('success' => true, 'message' => 'Bono agregado.', 'id' => $id));
        }
    }

    public function bonoEliminar() {
        $this->exigirAdmin();
        $id = intval(isset($_POST['id']) ? $_POST['id'] : 0);
        $db = Database::getInstance();
        $fila = $id ? $db->fetchOne("SELECT * FROM servicio_bonos WHERE id = :id", array('id' => $id)) : null;
        if (!$fila) {
            $this->json(array('success' => false, 'message' => 'Bono no encontrado.'));
        }
        $db->delete('servicio_bonos', 'id = :id', array('id' => $id));
        AuditHelper::log('eliminar_bono_servicio', 'servicio_bonos', $id, array('titulo' => $fila['titulo']), null);
        $this->json(array('success' => true, 'message' => 'Bono eliminado.'));
    }
}
