-- =============================================
-- Módulo de Ofrendas - Script SQL
-- =============================================

-- Tabla: registros_culto
-- Almacena los registros de ofrendas por culto
CREATE TABLE IF NOT EXISTS public.registros_culto
(
    id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ),
    fecha date NOT NULL,
    observaciones character varying(500) COLLATE pg_catalog."default",
    creado_por character varying(100) COLLATE pg_catalog."default",
    creado_en timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
    actualizado_en timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
    eliminado boolean NOT NULL DEFAULT false,
    CONSTRAINT registros_culto_pkey PRIMARY KEY (id)
);

COMMENT ON TABLE public.registros_culto IS 'Registros de ofrendas por culto';

-- Índice para búsqueda por fecha
CREATE INDEX IF NOT EXISTS idx_registros_culto_fecha ON public.registros_culto(fecha);
CREATE INDEX IF NOT EXISTS idx_registros_culto_eliminado ON public.registros_culto(eliminado);

-- =============================================

-- Tabla: ofrendas
-- Almacena las ofrendas individuales de cada registro
CREATE TABLE IF NOT EXISTS public.ofrendas
(
    id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ),
    registro_culto_id bigint NOT NULL,
    monto numeric(10,2) NOT NULL CHECK (monto > 0),
    concepto character varying(200) COLLATE pg_catalog."default" NOT NULL,
    eliminado boolean NOT NULL DEFAULT false,
    CONSTRAINT ofrendas_pkey PRIMARY KEY (id),
    CONSTRAINT fk_ofrendas_registro_culto FOREIGN KEY (registro_culto_id)
        REFERENCES public.registros_culto (id) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE CASCADE
);

COMMENT ON TABLE public.ofrendas IS 'Ofrendas individuales de cada registro de culto';

-- Índices
CREATE INDEX IF NOT EXISTS idx_ofrendas_registro_culto_id ON public.ofrendas(registro_culto_id);
CREATE INDEX IF NOT EXISTS idx_ofrendas_eliminado ON public.ofrendas(eliminado);

-- =============================================

-- Tabla: descuentos_ofrenda
-- Almacena los descuentos aplicados a cada ofrenda
CREATE TABLE IF NOT EXISTS public.descuentos_ofrenda
(
    id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ),
    ofrenda_id bigint NOT NULL,
    monto numeric(10,2) NOT NULL CHECK (monto > 0),
    concepto character varying(200) COLLATE pg_catalog."default" NOT NULL,
    eliminado boolean NOT NULL DEFAULT false,
    CONSTRAINT descuentos_ofrenda_pkey PRIMARY KEY (id),
    CONSTRAINT fk_descuentos_ofrenda_ofrenda FOREIGN KEY (ofrenda_id)
        REFERENCES public.ofrendas (id) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE CASCADE
);

COMMENT ON TABLE public.descuentos_ofrenda IS 'Descuentos aplicados a las ofrendas (diezmo, asignaciones, etc.)';

-- Índices
CREATE INDEX IF NOT EXISTS idx_descuentos_ofrenda_ofrenda_id ON public.descuentos_ofrenda(ofrenda_id);
CREATE INDEX IF NOT EXISTS idx_descuentos_ofrenda_eliminado ON public.descuentos_ofrenda(eliminado);

-- =============================================
-- Permisos para el módulo
-- =============================================

-- Primero crear el módulo si no existe
INSERT INTO public.modulos (nombre, descripcion, icono, orden, activo)
SELECT 'Secretaría', 'Módulo de secretaría de la iglesia', 'bi bi-journal-bookmark', 40, true
WHERE NOT EXISTS (SELECT 1 FROM public.modulos WHERE nombre = 'Secretaría');

-- Crear permisos para el controlador Ofrenda
INSERT INTO public.permisos (codigo, nombre, descripcion, modulo_id, activo)
SELECT 'Ofrenda.Index', 'Ver Ofrendas', 'Permite ver el listado de registros de ofrendas', 
       (SELECT id FROM public.modulos WHERE nombre = 'Secretaría'), true
WHERE NOT EXISTS (SELECT 1 FROM public.permisos WHERE codigo = 'Ofrenda.Index');

INSERT INTO public.permisos (codigo, nombre, descripcion, modulo_id, activo)
SELECT 'Ofrenda.Create', 'Crear Ofrenda', 'Permite crear nuevos registros de ofrendas', 
       (SELECT id FROM public.modulos WHERE nombre = 'Secretaría'), true
WHERE NOT EXISTS (SELECT 1 FROM public.permisos WHERE codigo = 'Ofrenda.Create');

INSERT INTO public.permisos (codigo, nombre, descripcion, modulo_id, activo)
SELECT 'Ofrenda.Edit', 'Editar Ofrenda', 'Permite editar registros de ofrendas', 
       (SELECT id FROM public.modulos WHERE nombre = 'Secretaría'), true
WHERE NOT EXISTS (SELECT 1 FROM public.permisos WHERE codigo = 'Ofrenda.Edit');

INSERT INTO public.permisos (codigo, nombre, descripcion, modulo_id, activo)
SELECT 'Ofrenda.Delete', 'Eliminar Ofrenda', 'Permite eliminar registros de ofrendas', 
       (SELECT id FROM public.modulos WHERE nombre = 'Secretaría'), true
WHERE NOT EXISTS (SELECT 1 FROM public.permisos WHERE codigo = 'Ofrenda.Delete');

INSERT INTO public.permisos (codigo, nombre, descripcion, modulo_id, activo)
SELECT 'Ofrenda.Details', 'Ver Detalle Ofrenda', 'Permite ver el detalle de un registro de ofrendas', 
       (SELECT id FROM public.modulos WHERE nombre = 'Secretaría'), true
WHERE NOT EXISTS (SELECT 1 FROM public.permisos WHERE codigo = 'Ofrenda.Details');
