CREATE TABLE chat_room
(
    cid         CHAR(16) NOT NULL PRIMARY KEY,               -- 채팅방 구분 코드: 6(bid) + 6(yyyyMMdd) + 4(숫자 카운트)
    bid         CHAR(6)  NOT NULL,                           -- 학원 구분 코드
    name        TEXT     NOT NULL,                           -- 채팅방 이름
    type        CHAR(4)  NOT NULL,                           -- 채팅방 유형 (1:1, 그룹 등)
    create_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 생성 일자
    open_date   DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 오픈 일자
    close_date  DATETIME,                                    -- 중지 일자 (채팅방 종료 처리)
    FOREIGN KEY (bid) REFERENCES academy (bid) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE TABLE chat_join
(
    cid       CHAR(16)    NOT NULL, -- 채팅방 구분 코드
    uid       VARCHAR(70) NOT NULL, -- 사용자 구분 코드
    join_date DATETIME    NOT NULL, -- 채팅방 입장 시간
    mid       CHAR(36),             -- 마지막 확인한 메시지 ID
    is_notice BOOLEAN DEFAULT TRUE, -- 알림 설정 여부
    PRIMARY KEY (cid, uid),
    FOREIGN KEY (cid) REFERENCES chat_room (cid) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY (uid) REFERENCES user (uid) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY (mid) REFERENCES chat_message (mid) ON UPDATE CASCADE
);

CREATE TABLE chat_message
(
    mid          CHAR(36)    NOT NULL PRIMARY KEY,   -- 메시지 구분 코드(UUID)
    cid          CHAR(16)    NOT NULL,               -- 채팅방 구분 코드
    uid          VARCHAR(70) NOT NULL,               -- 사용자 구분 코드
    create_date  DATETIME    NOT NULL,               -- 메시지 작성 일자
    content      TEXT        NOT NULL,               -- 메시지 내용
    is_hidden    BOOLEAN     NOT NULL DEFAULT FALSE, -- 가리기 여부
    media_url    TEXT,                               -- 첨부 파일 링크
    read_count   INT         NOT NULL DEFAULT 0,     -- 읽은 사람 수
    blind        BOOLEAN     NOT NULL DEFAULT FALSE, -- 신고로 인해 블라인드 처리 여부
    check_report BOOLEAN     NOT NULL DEFAULT FALSE, -- 신고 검토 여부
    FOREIGN KEY (cid) REFERENCES chat_room (cid) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY (uid) REFERENCES user (uid) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE INDEX idx_chat_message_cid ON chat_message(cid);
CREATE INDEX idx_chat_message_cid_create_date ON chat_message(cid, create_date);
CREATE INDEX idx_chat_message_uid_cid ON chat_message(uid, cid);

CREATE TABLE report_list
(
    cid    CHAR(16)    NOT NULL, -- 채팅방 구분 코드
    uid    VARCHAR(70) NOT NULL, -- 신고자 사용자 코드
    mid    CHAR(36)    NOT NULL, -- 신고된 메시지 ID
    report TEXT,                 -- 신고 사유
    PRIMARY KEY (cid, uid, mid),
    FOREIGN KEY (cid) REFERENCES chat_room (cid) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY (uid) REFERENCES user (uid) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY (mid) REFERENCES chat_message (mid) ON DELETE CASCADE ON UPDATE CASCADE
);
