-- Migration 019: relax user FKs so account deletion (Fase 10.5) works.
--
-- Spec (§6.3): deleting a user account must NOT delete the content they
-- created in collectives. Several `created_by`/`updated_by` FKs were
-- declared `NOT NULL REFERENCES public.users(id) ON DELETE RESTRICT`,
-- which would block delete_account() whenever the user has ever created
-- a list, task, note, etc.
--
-- This migration:
--   * drops the offending RESTRICT FKs, drops the NOT NULL, re-adds them
--     as `ON DELETE SET NULL`
--   * relaxes `collectives.created_by` likewise (the orphaned collective
--     becomes "created by deleted user")
--   * relaxes `collective_invitations.created_by` from CASCADE → SET NULL
--     so existing invitations survive the creator's account deletion
--
-- Reads of these columns in the UI should defensively show
-- "Deleted user" when null.

-- ── public.collectives ───────────────────────────────────────────────────────
ALTER TABLE public.collectives
    DROP CONSTRAINT collectives_created_by_fkey;
ALTER TABLE public.collectives
    ALTER COLUMN created_by DROP NOT NULL;
ALTER TABLE public.collectives
    ADD CONSTRAINT collectives_created_by_fkey
        FOREIGN KEY (created_by) REFERENCES public.users(id) ON DELETE SET NULL;

-- ── public.collective_invitations ────────────────────────────────────────────
ALTER TABLE public.collective_invitations
    DROP CONSTRAINT collective_invitations_created_by_fkey;
ALTER TABLE public.collective_invitations
    ALTER COLUMN created_by DROP NOT NULL;
ALTER TABLE public.collective_invitations
    ADD CONSTRAINT collective_invitations_created_by_fkey
        FOREIGN KEY (created_by) REFERENCES public.users(id) ON DELETE SET NULL;

-- ── public.shopping_lists ────────────────────────────────────────────────────
ALTER TABLE public.shopping_lists
    DROP CONSTRAINT shopping_lists_created_by_fkey;
ALTER TABLE public.shopping_lists
    ALTER COLUMN created_by DROP NOT NULL;
ALTER TABLE public.shopping_lists
    ADD CONSTRAINT shopping_lists_created_by_fkey
        FOREIGN KEY (created_by) REFERENCES public.users(id) ON DELETE SET NULL;

-- ── public.shopping_items ────────────────────────────────────────────────────
ALTER TABLE public.shopping_items
    DROP CONSTRAINT shopping_items_created_by_fkey;
ALTER TABLE public.shopping_items
    ALTER COLUMN created_by DROP NOT NULL;
ALTER TABLE public.shopping_items
    ADD CONSTRAINT shopping_items_created_by_fkey
        FOREIGN KEY (created_by) REFERENCES public.users(id) ON DELETE SET NULL;

-- ── public.task_lists ────────────────────────────────────────────────────────
ALTER TABLE public.task_lists
    DROP CONSTRAINT task_lists_created_by_fkey;
ALTER TABLE public.task_lists
    ALTER COLUMN created_by DROP NOT NULL;
ALTER TABLE public.task_lists
    ADD CONSTRAINT task_lists_created_by_fkey
        FOREIGN KEY (created_by) REFERENCES public.users(id) ON DELETE SET NULL;

-- ── public.tasks ─────────────────────────────────────────────────────────────
ALTER TABLE public.tasks
    DROP CONSTRAINT tasks_created_by_fkey;
ALTER TABLE public.tasks
    ALTER COLUMN created_by DROP NOT NULL;
ALTER TABLE public.tasks
    ADD CONSTRAINT tasks_created_by_fkey
        FOREIGN KEY (created_by) REFERENCES public.users(id) ON DELETE SET NULL;

-- ── public.notes ─────────────────────────────────────────────────────────────
ALTER TABLE public.notes
    DROP CONSTRAINT notes_created_by_fkey;
ALTER TABLE public.notes
    ALTER COLUMN created_by DROP NOT NULL;
ALTER TABLE public.notes
    ADD CONSTRAINT notes_created_by_fkey
        FOREIGN KEY (created_by) REFERENCES public.users(id) ON DELETE SET NULL;

ALTER TABLE public.notes
    DROP CONSTRAINT notes_updated_by_fkey;
ALTER TABLE public.notes
    ALTER COLUMN updated_by DROP NOT NULL;
ALTER TABLE public.notes
    ADD CONSTRAINT notes_updated_by_fkey
        FOREIGN KEY (updated_by) REFERENCES public.users(id) ON DELETE SET NULL;
