-- Tareas operativas del despacho por contribuyente. Recurrentes (semanal a
-- anual). Materialización lazy en tarea_periodos cuando el frontend lee.
-- Solo del presente en adelante.

CREATE TABLE IF NOT EXISTS tareas_catalogo (
  id                       uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  contribuyente_id         uuid NOT NULL REFERENCES contribuyentes(entidad_id) ON DELETE CASCADE,
  nombre                   text NOT NULL,
  descripcion              text,
  recurrencia              varchar(15) NOT NULL CHECK (recurrencia IN
                             ('semanal','quincenal','mensual','bimestral','trimestral','semestral','anual')),
  -- Para semanal/quincenal: día de la semana (1=lunes, 7=domingo)
  dia_semana               int CHECK (dia_semana BETWEEN 1 AND 7),
  -- Para mensual y mayores: día del mes (1-31). Si > último día del mes,
  -- se materializa al último día (ej. 31 en febrero → 28/29).
  dia_mes                  int CHECK (dia_mes BETWEEN 1 AND 31),
  solo_supervisor_completa boolean DEFAULT false,
  es_default               boolean DEFAULT false,
  active                   boolean DEFAULT true,
  orden                    int DEFAULT 0,
  created_at               timestamptz DEFAULT now()
);

CREATE INDEX IF NOT EXISTS ix_tareas_catalogo_contrib ON tareas_catalogo(contribuyente_id, active);

CREATE TABLE IF NOT EXISTS tarea_periodos (
  id              uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  tarea_id        uuid NOT NULL REFERENCES tareas_catalogo(id) ON DELETE CASCADE,
  -- '2025-W12' semanal/quincenal, '2025-01' mensual, '2025-B1' bimestral,
  -- '2025-Q1' trimestral, '2025-S1' semestral, '2025' anual.
  periodo         varchar(10) NOT NULL,
  fecha_limite    date NOT NULL,
  completada      boolean DEFAULT false,
  completada_at   timestamptz,
  completada_por  uuid,
  notas           text,
  created_at      timestamptz DEFAULT now(),
  UNIQUE (tarea_id, periodo)
);

CREATE INDEX IF NOT EXISTS ix_tarea_periodos_fecha ON tarea_periodos(fecha_limite);
CREATE INDEX IF NOT EXISTS ix_tarea_periodos_completada ON tarea_periodos(completada);

INSERT INTO tenant_migrations (scope, version, name)
VALUES ('vertical-contable', 35, '035_tareas')
ON CONFLICT (scope, version) DO NOTHING;
