/*
-- 1) Crear schema si no existe (no falla si ya existe)
CREATE SCHEMA IF NOT EXISTS demo;

-- 2) Apuntar el search_path al tenant
SET search_path TO demo;
*/
/* 03_indexes_triggers.sql */

-- Triggers updated_at
DROP TRIGGER IF EXISTS trg_empresa_updated ON empresa;
CREATE TRIGGER trg_empresa_updated
BEFORE UPDATE ON empresa
FOR EACH ROW EXECUTE FUNCTION set_updated_at();

DROP TRIGGER IF EXISTS trg_usuario_updated ON usuario;
CREATE TRIGGER trg_usuario_updated
BEFORE UPDATE ON usuario
FOR EACH ROW EXECUTE FUNCTION set_updated_at();

DROP TRIGGER IF EXISTS trg_sucursal_updated ON sucursal;
CREATE TRIGGER trg_sucursal_updated
BEFORE UPDATE ON sucursal
FOR EACH ROW EXECUTE FUNCTION set_updated_at();

DROP TRIGGER IF EXISTS trg_producto_updated ON producto;
CREATE TRIGGER trg_producto_updated
BEFORE UPDATE ON producto
FOR EACH ROW EXECUTE FUNCTION set_updated_at();

-- Índice parcial para single-session
DO $$
BEGIN
  IF NOT EXISTS (
    SELECT 1 FROM pg_indexes
    WHERE schemaname = current_schema() AND indexname = 'ux_user_session_activa'
  ) THEN
    EXECUTE 'CREATE UNIQUE INDEX ux_user_session_activa ON user_session(usuario_id) WHERE activo = TRUE';
  END IF;
END $$;

-- Presentación base 1 por producto
DO $$
BEGIN
  IF NOT EXISTS (
    SELECT 1 FROM pg_indexes
    WHERE schemaname = current_schema() AND indexname = 'ux_presentacion_base'
  ) THEN
    EXECUTE 'CREATE UNIQUE INDEX ux_presentacion_base ON producto_presentacion(producto_id) WHERE es_base = TRUE';
  END IF;
END $$;

-- Default lista por sucursal
DO $$
BEGIN
  IF NOT EXISTS (
    SELECT 1 FROM pg_indexes
    WHERE schemaname = current_schema() AND indexname = 'ux_sucursal_lista_default'
  ) THEN
    EXECUTE 'CREATE UNIQUE INDEX ux_sucursal_lista_default ON sucursal_lista_precio(sucursal_id) WHERE es_default = TRUE';
  END IF;
END $$;

-- Lote único por (producto, proveedor, código)
DO $$
BEGIN
  IF NOT EXISTS (
    SELECT 1 FROM pg_indexes
    WHERE schemaname = current_schema() AND indexname = 'ux_lote_prod_prov_cod'
  ) THEN
    EXECUTE 'CREATE UNIQUE INDEX ux_lote_prod_prov_cod ON lote(producto_id, proveedor_id, codigo_lote)';
  END IF;
END $$;

-- Índices de performance
CREATE INDEX IF NOT EXISTS idx_movinv_prod_fecha ON mov_inventario (producto_id, fecha DESC);
CREATE INDEX IF NOT EXISTS idx_puntos_cliente ON puntos_ledger (cliente_id, fecha DESC);
CREATE INDEX IF NOT EXISTS idx_venta_fecha ON venta (fecha DESC);
CREATE INDEX IF NOT EXISTS idx_compra_fecha ON compra (fecha DESC);
CREATE INDEX IF NOT EXISTS idx_lote_venc ON lote (vence_el);
CREATE INDEX IF NOT EXISTS idx_movcaja_fecha ON mov_caja (fecha DESC);
CREATE INDEX IF NOT EXISTS idx_producto_empresa_activo ON producto (empresa_id, activo);
