-- V51: 공지사항 + 사용자 알림 (notice + user_notification)
--      시스템 공지 / 정책 공지 / 이벤트 공지 + 사용자별 개인 알림(읽음 여부).

-- ============================================================
-- 1. notice — 공지사항
-- ============================================================

CREATE TABLE notice (
    notice_id    BIGSERIAL    PRIMARY KEY,
    title        VARCHAR(300) NOT NULL,
    content      TEXT         NOT NULL,
    notice_type  VARCHAR(20)  NOT NULL DEFAULT 'SYSTEM',
    start_date   DATE         NOT NULL,
    end_date     DATE,
    is_active    BOOLEAN      NOT NULL DEFAULT TRUE,
    created_by   BIGINT,
    created_at   TIMESTAMP    NOT NULL DEFAULT NOW(),
    updated_at   TIMESTAMP,
    updated_by   BIGINT,
    CHECK (notice_type IN ('SYSTEM','POLICY','EVENT')),
    CHECK (end_date IS NULL OR end_date >= start_date)
);

COMMENT ON TABLE  notice              IS '공지사항 — 시스템/정책/이벤트 공지 게시판';
COMMENT ON COLUMN notice.notice_type  IS 'SYSTEM=시스템공지/POLICY=정책공지/EVENT=이벤트';
COMMENT ON COLUMN notice.start_date   IS '공지 게시 시작일';
COMMENT ON COLUMN notice.end_date     IS '공지 게시 종료일 (NULL=무기한)';
COMMENT ON COLUMN notice.is_active    IS '공지 활성 여부';

CREATE INDEX idx_notice_date_type ON notice(start_date, end_date, notice_type, is_active);

-- ============================================================
-- 2. user_notification — 사용자 개인 알림
--    정산/이의신청/결재 등 이벤트 발생 시 개인 알림 생성.
-- ============================================================

CREATE TABLE user_notification (
    notification_id  BIGSERIAL    PRIMARY KEY,
    user_id          BIGINT       NOT NULL,
    -- users 테이블 참조 (느슨한 참조 — 공통모듈 의존 최소화)
    title            VARCHAR(300) NOT NULL,
    content          TEXT,
    ref_type         VARCHAR(30),
    -- 참조 업무 유형 (SETTLE/DISPUTE/APPROVAL/COMPLAINT 등)
    ref_id           BIGINT,
    -- 참조 레코드 PK
    is_read          BOOLEAN      NOT NULL DEFAULT FALSE,
    read_at          TIMESTAMP,
    created_at       TIMESTAMP    NOT NULL DEFAULT NOW(),
    CHECK (ref_type IS NULL OR ref_type IN ('SETTLE','DISPUTE','APPROVAL','COMPLAINT','INCENTIVE','WITHDRAW','NOTICE'))
);

COMMENT ON TABLE  user_notification           IS '사용자 개인 알림 — 이벤트 발생 시 user_id 단위로 생성';
COMMENT ON COLUMN user_notification.user_id   IS '알림 수신 사용자 ID';
COMMENT ON COLUMN user_notification.ref_type  IS '참조 업무 유형 (SETTLE/DISPUTE/APPROVAL/COMPLAINT/INCENTIVE/WITHDRAW/NOTICE)';
COMMENT ON COLUMN user_notification.ref_id    IS '참조 레코드 PK';
COMMENT ON COLUMN user_notification.is_read   IS '읽음 여부';
COMMENT ON COLUMN user_notification.read_at   IS '읽은 시각';

-- user_id+is_read 복합 인덱스 — 읽지 않은 알림 빠른 조회
CREATE INDEX idx_un_user_read    ON user_notification(user_id, is_read);
CREATE INDEX idx_un_created      ON user_notification(created_at DESC);
CREATE INDEX idx_un_ref          ON user_notification(ref_type, ref_id);
