-- =============================================================================
-- 10 — CAJA + FINANZAS: caja diaria, movimientos, costos, márgenes
-- =============================================================================

-- CAJAS (por sucursal, o una sola)
CREATE TABLE IF NOT EXISTS cajas (
    id              INT AUTO_INCREMENT PRIMARY KEY,
    nombre          VARCHAR(80) NOT NULL,            -- "Caja principal", "Caja delivery", "Caja salón"
    descripcion     TEXT,
    activa          TINYINT DEFAULT 1
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO cajas (nombre) VALUES ('Caja principal');

-- CIERRES DE CAJA: cada turno/día abre y cierra
CREATE TABLE IF NOT EXISTS caja_aperturas (
    id              INT AUTO_INCREMENT PRIMARY KEY,
    id_caja         INT NOT NULL,
    fecha_apertura  TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    saldo_inicial   DECIMAL(12,2) DEFAULT 0,
    id_usuario_abre INT,
    fecha_cierre    TIMESTAMP NULL,
    saldo_cierre_sistema  DECIMAL(12,2),             -- lo que dice el sistema que debería haber
    saldo_cierre_real     DECIMAL(12,2),             -- lo que contó el cajero
    diferencia      DECIMAL(12,2),                    -- real - sistema (positivo = sobrante, negativo = faltante)
    id_usuario_cierra INT,
    notas_cierre    TEXT,
    estado          ENUM('abierta','cerrada','revisada') DEFAULT 'abierta',
    FOREIGN KEY (id_caja) REFERENCES cajas(id),
    INDEX (id_caja, fecha_apertura),
    INDEX (estado)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- MOVIMIENTOS DE CAJA (cada operación que afecta la caja)
CREATE TABLE IF NOT EXISTS caja_movimientos (
    id              INT AUTO_INCREMENT PRIMARY KEY,
    id_caja_apertura INT NOT NULL,
    tipo            ENUM('ingreso_venta','egreso_compra','egreso_sueldo','egreso_gasto','retiro','aporte','transferencia_entre_cajas','ajuste') NOT NULL,
    monto           DECIMAL(12,2) NOT NULL,           -- positivo si entra, negativo si sale
    medio_pago      ENUM('efectivo','transferencia','tarjeta','mp','cheque','otros') NOT NULL,
    -- Referencias (uno de estos puede aplicar)
    id_pedido       INT NULL,                          -- si es venta
    id_pago_proveedor INT NULL,                        -- si es pago a prov
    id_pago_sueldo  INT NULL,                          -- futuro
    -- Descripción
    descripcion     VARCHAR(255) NOT NULL,
    comprobante     VARCHAR(120),                      -- nro de factura, recibo, etc.
    id_usuario      INT,
    fecha           TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (id_caja_apertura) REFERENCES caja_aperturas(id),
    FOREIGN KEY (id_pedido)        REFERENCES pedidos(id),
    INDEX (id_caja_apertura, fecha),
    INDEX (tipo, fecha)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- GASTOS FIJOS Y VARIABLES (alquiler, luz, gas, etc.)
CREATE TABLE IF NOT EXISTS gastos (
    id              INT AUTO_INCREMENT PRIMARY KEY,
    categoria       VARCHAR(60),                       -- "Alquiler", "Servicios", "Sueldos", "Limpieza"
    descripcion     VARCHAR(255) NOT NULL,
    monto           DECIMAL(12,2) NOT NULL,
    fecha           DATE NOT NULL,
    es_fijo         TINYINT DEFAULT 0,                 -- 1 si es gasto recurrente
    medio_pago      VARCHAR(40),
    id_caja_apertura INT NULL,                          -- si se pagó por caja
    id_usuario      INT,
    notas           TEXT,
    archivo_url     VARCHAR(255),                       -- comprobante
    INDEX (categoria, fecha),
    INDEX (fecha)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- COSTO DE PRODUCCIÓN ESTIMADO POR PRODUCTO (calculado desde recetas)
-- Tabla cache para no recalcular todo el tiempo
CREATE TABLE IF NOT EXISTS productos_costos (
    id_producto     INT NOT NULL,
    id_tamanio      INT NULL,
    costo_insumos   DECIMAL(12,4) NOT NULL,            -- suma de (cantidad * costo_promedio) de todos los insumos
    costo_empaque   DECIMAL(12,4) DEFAULT 0,
    costo_total     DECIMAL(12,4) NOT NULL,
    precio_venta    DECIMAL(12,2),                     -- snapshot del precio actual
    margen_bruto    DECIMAL(8,2),                      -- precio_venta - costo_total
    margen_porcentaje DECIMAL(5,2),                    -- margen / precio_venta * 100
    updated_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (id_producto, id_tamanio),
    FOREIGN KEY (id_producto) REFERENCES productos(id) ON DELETE CASCADE,
    FOREIGN KEY (id_tamanio)  REFERENCES tamanios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- VISTAS / REPORTES (se calculan con queries — acá solo dejamos espacio para cache si hace falta)

-- Snapshot diario de KPIs (cron al final del día)
CREATE TABLE IF NOT EXISTS reportes_diarios (
    fecha                   DATE PRIMARY KEY,
    pedidos_total           INT,
    pedidos_completados     INT,
    pedidos_cancelados      INT,
    ventas_brutas           DECIMAL(12,2),
    descuentos_aplicados    DECIMAL(12,2),
    envios_cobrados         DECIMAL(12,2),
    ventas_netas            DECIMAL(12,2),
    costo_insumos_total     DECIMAL(12,2),             -- consumido según recetas
    gastos_dia              DECIMAL(12,2),
    ganancia_estimada       DECIMAL(12,2),
    ticket_promedio         DECIMAL(8,2),
    clientes_unicos         INT,
    clientes_nuevos         INT,
    productos_top_3_json    JSON,
    horario_pico_inicio     TIME,
    horario_pico_fin        TIME
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
