-- Fuerza utf8mb4 en esta sesión, sin importar el charset por defecto
-- del cliente que cargue este archivo (evita que 'ñ' y tildes se
-- corrompan silenciosamente, sin ningún error, como pasó en las pruebas)
SET NAMES utf8mb4;

-- ============================================
-- Schema: Barbería SaaS POS - Multi-tenant
-- Motor: MySQL 5.7+ (probado real contra 5.7.41, el hosting real de Juan)
-- Patrón: DB compartida, aislamiento por tenant_id
-- ============================================

-- Tabla maestra de clientes (barberías)
CREATE TABLE tenants (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre_comercial VARCHAR(150) NOT NULL,
    slug VARCHAR(60) NOT NULL UNIQUE,  -- URL pública de agendamiento: tuservicio.cl/b/{slug}
    rut VARCHAR(15),
    email_contacto VARCHAR(150),
    telefono VARCHAR(20),
    estado ENUM('activo','suspendido','eliminado') NOT NULL DEFAULT 'activo',
    plan_id INT UNSIGNED,
    fecha_vencimiento_plan DATE,
    fecha_conversion_real DATE NULL,  -- se llena cuando el superadmin limpia los datos de prueba;
                                        -- sirve para medir cuántos días de trial usó antes de convertir
    onboarding_completado BOOLEAN NOT NULL DEFAULT FALSE,  -- FALSE = quedó a medio wizard, se le puede hacer seguimiento
    onboarding_paso VARCHAR(50) NULL,   -- ej: 'sucursales','servicios','comisiones','citas','confirmacion'
    -- Módulos activables/desactivables por cliente. Ej: {"citas_habilitadas": true}
    features JSON NOT NULL,  -- el valor inicial lo pone la app al crear el tenant, no un DEFAULT
                              -- (algunos MySQL/MariaDB de hosting compartido no soportan DEFAULT con funciones en columnas JSON)
    creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    actualizado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_estado (estado)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Configuración SII por tenant (Lioren u otro proveedor)
CREATE TABLE tenant_config_sii (
    tenant_id INT UNSIGNED PRIMARY KEY,
    razon_social VARCHAR(150),
    rut_emisor VARCHAR(15),
    giro VARCHAR(150),
    direccion VARCHAR(200),
    comuna VARCHAR(100),
    api_token VARCHAR(255),      -- token Lioren u otro, cifrado en reposo
    ambiente ENUM('certificacion','produccion') DEFAULT 'certificacion',
    ultimo_folio_boleta INT UNSIGNED DEFAULT 0,
    actualizado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Configuración de pago online para citas: modalidad + pasarela (Mercado Pago / Flow)
CREATE TABLE tenant_config_pagos (
    tenant_id INT UNSIGNED PRIMARY KEY,
    modalidad_pago_citas ENUM('pago_en_local','pago_online_opcional','pago_online_obligatorio')
        NOT NULL DEFAULT 'pago_en_local',
    -- pago_en_local: solo agenda, se cobra cuando lo atienden (modalidad B)
    -- pago_online_opcional: el cliente elige pagar ahora o en el local
    -- pago_online_obligatorio: debe pagar para confirmar la cita (modalidad A)
    mercadopago_habilitado BOOLEAN NOT NULL DEFAULT FALSE,
    mercadopago_access_token VARCHAR(255) NULL,   -- cifrado en reposo, igual que api_token de SII
    mercadopago_public_key VARCHAR(255) NULL,
    flow_habilitado BOOLEAN NOT NULL DEFAULT FALSE,
    flow_api_key VARCHAR(255) NULL,               -- cifrado en reposo
    flow_secret_key VARCHAR(255) NULL,            -- cifrado en reposo
    actualizado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE planes (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(50) NOT NULL,                  -- ej: "Plan Mensual", "Plan Semestral", "Plan Anual"
    periodicidad ENUM('mensual','semestral','anual') NOT NULL,
    precio_final DECIMAL(10,2) NOT NULL,          -- precio del PERÍODO COMPLETO, IVA incluido (lo que paga el cliente)
    max_usuarios INT UNSIGNED,
    max_sucursales INT UNSIGNED DEFAULT 1,
    es_trial BOOLEAN NOT NULL DEFAULT FALSE,      -- ej: "Plan Prueba", precio_final = 0
    duracion_dias_trial INT UNSIGNED NULL,        -- solo aplica si es_trial = TRUE, ej: 14
    activo BOOLEAN DEFAULT TRUE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Complementos opcionales, pagados aparte del plan (ej: integración SII = 1 UF + IVA)
CREATE TABLE complementos (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(50) NOT NULL UNIQUE,   -- ej: 'integracion_sii'
    nombre VARCHAR(100) NOT NULL,
    precio_mensual_final DECIMAL(10,2) NOT NULL, -- ej: 18000, IVA incluido. Se cobra × meses del período elegido
    limite_uso_mensual INT UNSIGNED NULL,        -- ej: 2500 documentos/mes; NULL = sin límite
    unidad_limite VARCHAR(50) NULL,              -- ej: 'documentos_tributarios'
    activo BOOLEAN DEFAULT TRUE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Complementos que cada tenant tiene contratados
CREATE TABLE tenant_complementos (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id INT UNSIGNED NOT NULL,
    complemento_id INT UNSIGNED NOT NULL,
    fecha_contratado DATE NOT NULL,
    estado ENUM('activo','cancelado') NOT NULL DEFAULT 'activo',
    UNIQUE KEY uq_tenant_complemento (tenant_id, complemento_id),
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (complemento_id) REFERENCES complementos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Pagos de SUSCRIPCIÓN (lo que cada barbería te paga a TI por usar el sistema —
-- distinto de tenant_config_pagos, que es lo que cada barbería le cobra a SUS clientes)
CREATE TABLE pagos_suscripcion (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id INT UNSIGNED NOT NULL,
    plan_id INT UNSIGNED NOT NULL,
    monto_plan DECIMAL(10,2) NOT NULL,        -- neto
    monto_complementos DECIMAL(10,2) NOT NULL DEFAULT 0,  -- neto, ya convertido de UF a CLP
    monto_iva DECIMAL(10,2) NOT NULL DEFAULT 0,
    monto_total DECIMAL(10,2) NOT NULL,
    gateway ENUM('mercadopago','flow') NOT NULL,
    referencia_pago VARCHAR(100) NOT NULL,
    estado ENUM('pendiente','pagado','fallido','reembolsado') NOT NULL DEFAULT 'pendiente',
    periodo_desde DATE NOT NULL,
    periodo_hasta DATE NOT NULL,
    creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_tenant (tenant_id),
    INDEX idx_estado (estado),
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (plan_id) REFERENCES planes(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Config de pago de Setec Chile como plataforma (cobrar suscripciones a tus clientes).
-- Tabla singleton: siempre una sola fila con id = 1. Distinta de tenant_config_pagos.
CREATE TABLE plataforma_config_pagos (
    id INT UNSIGNED PRIMARY KEY DEFAULT 1,
    mercadopago_access_token VARCHAR(255) NULL,   -- cifrado en reposo
    mercadopago_public_key VARCHAR(255) NULL,
    flow_api_key VARCHAR(255) NULL,               -- cifrado en reposo
    flow_secret_key VARCHAR(255) NULL,             -- cifrado en reposo
    actualizado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Usuarios (superadmin sin tenant_id, el resto con tenant_id)
CREATE TABLE usuarios (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id INT UNSIGNED NULL,          -- NULL = superadmin global
    nombre VARCHAR(100) NOT NULL,
    apellido VARCHAR(100) NOT NULL,
    telefono VARCHAR(20) NOT NULL,   -- teléfono personal; permite seguimiento de demos y notificaciones al staff
    email VARCHAR(150) NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    rol ENUM('superadmin','dueño','admin_local','barbero','cajero') NOT NULL,
    estado ENUM('activo','suspendido') NOT NULL DEFAULT 'activo',
    creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uq_email_tenant (tenant_id, email),
    INDEX idx_tenant (tenant_id),
    INDEX idx_telefono (telefono),
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Invitaciones: el usuario real (con clave) se crea recién cuando la persona acepta.
-- Evita tener filas de "usuarios" con password_hash falso mientras esperan aceptar.
CREATE TABLE invitaciones (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id INT UNSIGNED NOT NULL,
    nombre VARCHAR(100) NOT NULL,
    apellido VARCHAR(100) NOT NULL,
    telefono VARCHAR(20) NOT NULL,
    email VARCHAR(150) NOT NULL,
    rol ENUM('admin_local','barbero','cajero') NOT NULL,
    token VARCHAR(64) NOT NULL UNIQUE,   -- va en el link: tuservicio.cl/invitacion/{token}
    -- Modelo de comisión pre-configurado por el dueño al invitar (mismo shape que
    -- personal_comision_config; se copia hacia allá recién cuando la persona acepta)
    modelo_comision ENUM('comision_estandar','arriendo_silla','arriendo_fijo') NULL,
    porcentaje_local DECIMAL(5,2) NULL,
    monto_arriendo_fijo DECIMAL(10,2) NULL,
    periodo_pago ENUM('inmediato','diario','semanal','quincenal','mensual') NULL,
    estado ENUM('pendiente','aceptada','expirada','cancelada') NOT NULL DEFAULT 'pendiente',
    expira_en DATETIME NOT NULL,
    invitado_por INT UNSIGNED NOT NULL,
    creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_tenant_email (tenant_id, email),
    INDEX idx_token (token),
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (invitado_por) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Sucursales (por si una barbería tiene más de un local)
CREATE TABLE sucursales (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id INT UNSIGNED NOT NULL,
    nombre VARCHAR(100) NOT NULL,
    direccion VARCHAR(200),
    activo BOOLEAN DEFAULT TRUE,
    INDEX idx_tenant (tenant_id),
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Servicios (corte, barba, cejas, tratamientos faciales, etc.)
CREATE TABLE servicios (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id INT UNSIGNED NOT NULL,
    categoria ENUM('cabello','barba','cejas','facial','otro') NOT NULL DEFAULT 'cabello',
    nombre VARCHAR(100) NOT NULL,
    precio DECIMAL(10,2) NOT NULL,
    precio_online DECIMAL(10,2) NULL,  -- precio con descuento si el cliente paga al agendar online; NULL = mismo precio
    color_hex VARCHAR(7) DEFAULT '#6B7280',  -- color del bloque en la agenda visual
    duracion_min INT UNSIGNED DEFAULT 30,
    porcentaje_comision DECIMAL(5,2) DEFAULT 0,
    activo BOOLEAN DEFAULT TRUE,
    INDEX idx_tenant (tenant_id),
    INDEX idx_tenant_categoria (tenant_id, categoria),
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Productos (pomadas, shampoo, perfumes, etc.)
CREATE TABLE productos (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id INT UNSIGNED NOT NULL,
    categoria VARCHAR(50) NOT NULL DEFAULT 'general',  -- ej: styling, fragancias, cuidado_barba
    nombre VARCHAR(100) NOT NULL,
    precio DECIMAL(10,2) NOT NULL,
    stock INT DEFAULT 0,
    stock_minimo INT UNSIGNED NOT NULL DEFAULT 5,  -- bajo este número, aparece en alertas
    porcentaje_comision DECIMAL(5,2) DEFAULT 0,
    activo BOOLEAN DEFAULT TRUE,
    INDEX idx_tenant (tenant_id),
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Ventas (cabecera)
CREATE TABLE ventas (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id INT UNSIGNED NOT NULL,
    sucursal_id INT UNSIGNED NOT NULL,
    barbero_id INT UNSIGNED NOT NULL,     -- quién hizo el servicio (dueño de la comisión de servicio)
    cajero_id INT UNSIGNED NULL,          -- quién cobró/procesó el pago (puede ganar comisión por venta de producto)
    folio_sii INT UNSIGNED NULL,
    tipo_dc ENUM('boleta','factura','sin_documento') DEFAULT 'boleta',
    total DECIMAL(10,2) NOT NULL,
    metodo_pago ENUM('efectivo','debito','credito','transferencia') NOT NULL,
    estado ENUM('cobrado','anulado') DEFAULT 'cobrado',
    fecha DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    -- SIEMPRE filtrar por tenant_id primero: índice compuesto
    INDEX idx_tenant_fecha (tenant_id, fecha),
    INDEX idx_barbero (barbero_id),
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (sucursal_id) REFERENCES sucursales(id),
    FOREIGN KEY (barbero_id) REFERENCES usuarios(id),
    FOREIGN KEY (cajero_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Detalle de venta (servicios y/o productos)
CREATE TABLE venta_items (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    venta_id BIGINT UNSIGNED NOT NULL,
    tipo ENUM('servicio','producto') NOT NULL,
    referencia_id INT UNSIGNED NOT NULL,
    nombre_snapshot VARCHAR(100) NOT NULL,  -- nombre al momento de vender
    precio_unitario DECIMAL(10,2) NOT NULL,
    cantidad INT UNSIGNED DEFAULT 1,
    monto_barbero DECIMAL(10,2) DEFAULT 0,  -- lo que se lleva quien prestó el servicio/vendió
    monto_local DECIMAL(10,2) DEFAULT 0,    -- lo que se queda la barbería
    INDEX idx_venta (venta_id),
    FOREIGN KEY (venta_id) REFERENCES ventas(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- Módulo de Citas (opcional, activable por tenant vía tenants.features)
-- ============================================

-- Clientes: historial para no repreguntar datos en cada llamada
CREATE TABLE clientes (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id INT UNSIGNED NOT NULL,
    nombre VARCHAR(100) NOT NULL,
    telefono VARCHAR(20),
    email VARCHAR(150) NULL,
    notas VARCHAR(255),
    creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_tenant_telefono (tenant_id, telefono),
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Horario semanal recurrente por barbero (la regla general)
CREATE TABLE horarios_barbero (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id INT UNSIGNED NOT NULL,
    barbero_id INT UNSIGNED NOT NULL,
    dia_semana TINYINT UNSIGNED NOT NULL,  -- 1=domingo ... 7=sábado
    hora_inicio TIME NOT NULL,
    hora_fin TIME NOT NULL,
    activo BOOLEAN DEFAULT TRUE,
    UNIQUE KEY uq_barbero_dia (barbero_id, dia_semana),
    INDEX idx_tenant (tenant_id),
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (barbero_id) REFERENCES usuarios(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Excepciones puntuales: vacaciones, licencia, o horario especial en una fecha exacta
CREATE TABLE excepciones_horario (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id INT UNSIGNED NOT NULL,
    barbero_id INT UNSIGNED NOT NULL,
    fecha DATE NOT NULL,
    tipo ENUM('no_disponible','horario_especial') NOT NULL,
    hora_inicio TIME NULL,   -- solo si tipo = horario_especial
    hora_fin TIME NULL,
    motivo VARCHAR(100),     -- ej: 'vacaciones', 'licencia', 'evento'
    UNIQUE KEY uq_barbero_fecha (barbero_id, fecha),
    INDEX idx_tenant (tenant_id),
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (barbero_id) REFERENCES usuarios(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Citas agendadas
CREATE TABLE citas (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id INT UNSIGNED NOT NULL,
    sucursal_id INT UNSIGNED NOT NULL,
    barbero_id INT UNSIGNED NOT NULL,
    cliente_id INT UNSIGNED NULL,
    fecha_inicio DATETIME NOT NULL,
    fecha_fin DATETIME NOT NULL,   -- calculada sumando duracion_min de los servicios elegidos
    estado ENUM('agendada','confirmada','completada','cancelada','no_show') NOT NULL DEFAULT 'agendada',
    origen ENUM('interno','online') NOT NULL DEFAULT 'interno',  -- interno = la creó el staff; online = la creó el cliente desde el link público
    pago_estado ENUM('pendiente','pagado_online','pagado_en_local') NOT NULL DEFAULT 'pendiente',
    monto_pagado_online DECIMAL(10,2) NULL,
    gateway_pago ENUM('mercadopago','flow') NULL,       -- con qué pasarela se pagó
    referencia_pago VARCHAR(100) NULL,                  -- ID de transacción externo, para reconciliar/reembolsar
    creado_por INT UNSIGNED NULL,  -- usuarios.id si la creó staff; NULL si origen = online (la creó el cliente)
    venta_id BIGINT UNSIGNED NULL,     -- se enlaza cuando la cita se concreta en una venta
    notas VARCHAR(255),
    creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_tenant_fecha (tenant_id, fecha_inicio),
    INDEX idx_barbero_fecha (barbero_id, fecha_inicio),
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (sucursal_id) REFERENCES sucursales(id),
    FOREIGN KEY (barbero_id) REFERENCES usuarios(id),
    FOREIGN KEY (cliente_id) REFERENCES clientes(id) ON DELETE SET NULL,
    FOREIGN KEY (creado_por) REFERENCES usuarios(id),
    FOREIGN KEY (venta_id) REFERENCES ventas(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Historial de traspasos de una cita entre barberos (ej: no puede ir, no
-- le alcanza el tiempo). El motivo es obligatorio a propósito — no es
-- un campo libre opcional, es el registro de por qué cambió de manos.
-- Una cita puede traspasarse más de una vez, por eso es tabla aparte y
-- no solo un campo en citas.
CREATE TABLE citas_traspasos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    cita_id BIGINT UNSIGNED NOT NULL,
    barbero_anterior_id INT UNSIGNED NOT NULL,
    barbero_nuevo_id INT UNSIGNED NOT NULL,
    motivo VARCHAR(255) NOT NULL,
    traspasado_por INT UNSIGNED NOT NULL,  -- el barbero mismo, o el dueño/admin_local en su nombre
    creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_cita (cita_id),
    FOREIGN KEY (cita_id) REFERENCES citas(id) ON DELETE CASCADE,
    FOREIGN KEY (barbero_anterior_id) REFERENCES usuarios(id),
    FOREIGN KEY (barbero_nuevo_id) REFERENCES usuarios(id),
    FOREIGN KEY (traspasado_por) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Servicios incluidos en cada cita (permite combos: corte + barba en una sola cita)
CREATE TABLE cita_servicios (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    cita_id BIGINT UNSIGNED NOT NULL,
    servicio_id INT UNSIGNED NOT NULL,
    INDEX idx_cita (cita_id),
    FOREIGN KEY (cita_id) REFERENCES citas(id) ON DELETE CASCADE,
    FOREIGN KEY (servicio_id) REFERENCES servicios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Modelo de negocio por persona: comisión estándar, arriendo de silla, o arriendo fijo
CREATE TABLE personal_comision_config (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id INT UNSIGNED NOT NULL,
    usuario_id INT UNSIGNED NOT NULL,      -- aplica a barbero o cajero
    modelo ENUM('comision_estandar','arriendo_silla','arriendo_fijo') NOT NULL DEFAULT 'comision_estandar',
    -- comision_estandar: usa servicios.porcentaje_comision / productos.porcentaje_comision tal cual (barbero se lleva ese %)
    -- arriendo_silla: este % es lo que se queda EL LOCAL de cada venta (barbero se queda el resto, es "independiente")
    -- arriendo_fijo: barbero se queda el 100% de cada venta; paga un monto fijo periódico aparte (no afecta venta_items)
    porcentaje_local DECIMAL(5,2) NULL,    -- solo aplica si modelo = arriendo_silla
    monto_arriendo_fijo DECIMAL(10,2) NULL,-- solo aplica si modelo = arriendo_fijo
    periodo_pago ENUM('inmediato','diario','semanal','quincenal','mensual') NULL,
    -- inmediato: se reparte en efectivo al toque, cada venta ya queda saldada (no genera liquidación)
    -- diario/semanal/quincenal/mensual: se acumula y se paga junto, ver tabla liquidaciones
    vigente_desde DATE NOT NULL,
    notas VARCHAR(255),
    INDEX idx_tenant_usuario (tenant_id, usuario_id),
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Liquidaciones: cierre de pago por persona y período (foto congelada, no se recalcula sola)
CREATE TABLE liquidaciones (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id INT UNSIGNED NOT NULL,
    usuario_id INT UNSIGNED NOT NULL,          -- barbero o cajero liquidado
    periodo_inicio DATE NOT NULL,
    periodo_fin DATE NOT NULL,
    modelo_aplicado ENUM('comision_estandar','arriendo_silla','arriendo_fijo') NOT NULL,
    total_ventas DECIMAL(10,2) NOT NULL DEFAULT 0,           -- suma bruta de sus venta_items del período
    total_a_favor_persona DECIMAL(10,2) NOT NULL DEFAULT 0,  -- lo que se le paga a él/ella
    total_a_favor_local DECIMAL(10,2) NOT NULL DEFAULT 0,    -- lo que se queda/cobra la barbería
    estado ENUM('generada','pagada','anulada') NOT NULL DEFAULT 'generada',
    fecha_pago DATETIME NULL,
    generado_por INT UNSIGNED NOT NULL,        -- quién cerró el período
    notas VARCHAR(255),
    creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uq_usuario_periodo (usuario_id, periodo_inicio, periodo_fin),
    INDEX idx_tenant_periodo (tenant_id, periodo_inicio),
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (usuario_id) REFERENCES usuarios(id),
    FOREIGN KEY (generado_por) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Detalle: qué venta_items exactos componen cada liquidación (evita doble pago, da trazabilidad)
CREATE TABLE liquidacion_detalle (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    liquidacion_id BIGINT UNSIGNED NOT NULL,
    venta_item_id BIGINT UNSIGNED NOT NULL,
    monto_persona DECIMAL(10,2) NOT NULL,
    monto_local DECIMAL(10,2) NOT NULL,
    UNIQUE KEY uq_venta_item (venta_item_id),  -- un venta_item solo puede entrar en UNA liquidación
    INDEX idx_liquidacion (liquidacion_id),
    FOREIGN KEY (liquidacion_id) REFERENCES liquidaciones(id) ON DELETE CASCADE,
    FOREIGN KEY (venta_item_id) REFERENCES venta_items(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- Módulo de Finanzas: Ingresos y Egresos del negocio
-- ============================================
-- OJO al construir reportes: el "ingreso real" del local NO es ventas.total sumado.
-- Es venta_items.monto_local sumado (lo que efectivamente queda en la barbería,
-- descontando lo que se lleva cada barbero) + otros_ingresos. Sumar ventas.total
-- a secas repite el mismo error de mezclar neto/bruto que encontraste en SetecPOS.

-- Categorías de gasto, editables por tenant
CREATE TABLE categorias_gasto (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id INT UNSIGNED NOT NULL,
    nombre VARCHAR(80) NOT NULL,   -- ej: Arriendo local, Servicios básicos, Insumos, Sueldos, Marketing
    activo BOOLEAN DEFAULT TRUE,
    INDEX idx_tenant (tenant_id),
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Gastos (egresos)
CREATE TABLE gastos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id INT UNSIGNED NOT NULL,
    sucursal_id INT UNSIGNED NULL,     -- NULL = gasto general del negocio, no de un local puntual
    categoria_id INT UNSIGNED NOT NULL,
    descripcion VARCHAR(200) NOT NULL,
    proveedor VARCHAR(150),
    monto_neto DECIMAL(10,2) NOT NULL,
    monto_iva DECIMAL(10,2) NOT NULL DEFAULT 0,    -- IVA crédito fiscal, solo si tiene_factura
    monto_total DECIMAL(10,2) NOT NULL,            -- neto + iva
    tiene_factura BOOLEAN NOT NULL DEFAULT FALSE,  -- da derecho a crédito fiscal si es TRUE
    metodo_pago ENUM('efectivo','debito','credito','transferencia') NOT NULL,
    es_recurrente BOOLEAN NOT NULL DEFAULT FALSE,  -- ej: arriendo del local, internet, luz
    fecha DATE NOT NULL,
    registrado_por INT UNSIGNED NOT NULL,
    creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_tenant_fecha (tenant_id, fecha),
    INDEX idx_categoria (categoria_id),
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (sucursal_id) REFERENCES sucursales(id),
    FOREIGN KEY (categoria_id) REFERENCES categorias_gasto(id),
    FOREIGN KEY (registrado_por) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Otros ingresos, fuera de las ventas normales del POS
-- (ej: pago de arriendo de silla fijo de un barbero, venta de un activo, devolución de proveedor)
CREATE TABLE otros_ingresos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id INT UNSIGNED NOT NULL,
    sucursal_id INT UNSIGNED NULL,
    concepto VARCHAR(150) NOT NULL,
    barbero_id INT UNSIGNED NULL,   -- se llena cuando es pago de arriendo de silla de un barbero específico
    monto DECIMAL(10,2) NOT NULL,
    metodo_pago ENUM('efectivo','debito','credito','transferencia') NOT NULL,
    fecha DATE NOT NULL,
    registrado_por INT UNSIGNED NOT NULL,
    creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_tenant_fecha (tenant_id, fecha),
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (sucursal_id) REFERENCES sucursales(id),
    FOREIGN KEY (barbero_id) REFERENCES usuarios(id),
    FOREIGN KEY (registrado_por) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Auditoría de acciones del superadmin
-- Obligatorio: el superadmin puede eliminar/suspender clientes y tocar config SII
CREATE TABLE superadmin_logs (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    superadmin_id INT UNSIGNED NOT NULL,
    tenant_id INT UNSIGNED NULL,
    accion VARCHAR(100) NOT NULL,  -- 'eliminar_tenant' | 'suspender_tenant' | 'editar_sii' | 'reset_password'
    detalle JSON NULL,
    creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_tenant (tenant_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- Módulo de Recordatorios (WhatsApp / Email)
-- ============================================

-- Preferencia de cada tenant: encendido/apagado, canales, con cuánta
-- anticipación. Las credenciales NO van acá, van en plataforma_config_mensajeria
-- (Setec manda los recordatorios en nombre de cada barbería, mismo patrón
-- que evita que cada negocio chico tenga que verificarse solo ante Meta).
CREATE TABLE tenant_config_recordatorios (
    tenant_id INT UNSIGNED PRIMARY KEY,
    habilitado BOOLEAN NOT NULL DEFAULT FALSE,
    canal_whatsapp BOOLEAN NOT NULL DEFAULT TRUE,
    canal_email BOOLEAN NOT NULL DEFAULT FALSE,
    modo_whatsapp ENUM('api','web','manual') NOT NULL DEFAULT 'manual',
    -- api: Meta WhatsApp Business Cloud API, requiere plantilla aprobada
    -- web: sesión tipo whatsapp-web.js/Baileys — no oficial, riesgo de baneo
    -- manual: el sistema arma el link wa.me, una persona lo manda a mano
    horas_antes INT UNSIGNED NOT NULL DEFAULT 24,
    actualizado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Estado de la sesión de WhatsApp Web de cada tenant que use modo_whatsapp='web'.
-- La sesión real (QR, navegador conectado) la maneja un proceso aparte —
-- esta tabla es solo el "semáforo" que el sistema principal consulta.
CREATE TABLE tenant_whatsapp_web_sesiones (
    tenant_id INT UNSIGNED PRIMARY KEY,
    estado ENUM('desconectado','esperando_qr','conectado') NOT NULL DEFAULT 'desconectado',
    telefono_conectado VARCHAR(20) NULL,
    actualizado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Credenciales de mensajería de LA PLATAFORMA (igual patrón que
-- plataforma_config_pagos). Tabla singleton, id=1 fijo.
CREATE TABLE plataforma_config_mensajeria (
    id INT UNSIGNED PRIMARY KEY DEFAULT 1,
    whatsapp_api_token VARCHAR(255) NULL,       -- cifrado en reposo (Meta WhatsApp Business Cloud API)
    whatsapp_phone_number_id VARCHAR(100) NULL,
    email_api_key VARCHAR(255) NULL,            -- cifrado en reposo (ej: Resend)
    email_remitente VARCHAR(150) NULL,          -- ej: 'reservas@tuservicio.cl'
    actualizado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Qué recordatorio se mandó y por qué canal, para no duplicar y tener
-- trazabilidad. El UNIQUE KEY es lo que garantiza que una cita nunca
-- reciba el mismo recordatorio dos veces, aunque el job corra encimado.
CREATE TABLE recordatorios_enviados (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    cita_id BIGINT UNSIGNED NOT NULL,
    canal ENUM('whatsapp','email') NOT NULL,
    estado ENUM('enviado','fallido') NOT NULL,
    enviado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uq_cita_canal (cita_id, canal),
    FOREIGN KEY (cita_id) REFERENCES citas(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- Datos iniciales
-- ============================================

-- Plan de prueba: 14 días gratis, requerido para que /api/onboarding/confirmar
-- funcione. Límites conservadores (3 usuarios, 1 sucursal) — ajustar según
-- convenga; esto es dato de negocio, no algo que dependa del código.
INSERT INTO planes (nombre, periodicidad, precio_final, max_usuarios, max_sucursales, es_trial, duracion_dias_trial, activo)
VALUES ('Plan Prueba', 'mensual', 0, 3, 1, TRUE, 14, TRUE);

-- Planes de pago reales
INSERT INTO planes (nombre, periodicidad, precio_final, max_usuarios, max_sucursales, es_trial, activo) VALUES
    ('Plan Mensual', 'mensual', 20000, NULL, NULL, FALSE, TRUE),
    ('Plan Semestral', 'semestral', 90000, NULL, NULL, FALSE, TRUE),
    ('Plan Anual', 'anual', 150000, NULL, NULL, FALSE, TRUE);

-- Complemento de integración SII: $18.000 netos por mes (se multiplica por
-- la cantidad de meses del período elegido), tope de 2.500 documentos
-- tributarios al mes. Control interno (sin este complemento) no tiene tope.
INSERT INTO complementos (codigo, nombre, precio_mensual_final, limite_uso_mensual, unidad_limite, activo)
VALUES ('integracion_sii', 'Integración SII (boleta/factura electrónica)', 18000, 2500, 'documentos_tributarios', TRUE);
