-- ============================================
-- FLASHCARD SYSTEM
-- ============================================

CREATE TABLE flashcard_list (
                                id            SERIAL PRIMARY KEY,
                                title         VARCHAR(255) NOT NULL,
                                description   TEXT,
                                total_words   INT DEFAULT 0,
                                created_by    INT REFERENCES users(id) ON DELETE SET NULL,
                                created_at    TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE flashcard_term (
                                id              SERIAL PRIMARY KEY,
                                list_id         INT NOT NULL REFERENCES flashcard_list(id) ON DELETE CASCADE,
                                word            VARCHAR(255) NOT NULL,
                                part_of_speech  VARCHAR(50),               -- "adjective", "noun", "verb"...
                                phonetic        VARCHAR(100),              -- "/kəˈmɜːʃəl/"
                                definition      TEXT,                      -- nghĩa tiếng Việt
                                example         TEXT,                      -- câu ví dụ (EN + VI)
                                image_url       VARCHAR(500),
                                audio_tts_text  VARCHAR(255),              -- text để TTS (thường = word)
                                audio_lang      VARCHAR(10) DEFAULT 'en-US',
                                display_order   INT DEFAULT 0,
                                created_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE user_flashcard_list (
                                     user_id         INT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
                                     list_id         INT NOT NULL REFERENCES flashcard_list(id) ON DELETE CASCADE,
                                     enrolled_at     TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                                     PRIMARY KEY (user_id, list_id)
);

CREATE TABLE user_flashcard_progress (
                                         id                  SERIAL PRIMARY KEY,
                                         user_id             INT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
                                         term_id             INT NOT NULL REFERENCES flashcard_term(id) ON DELETE CASCADE,
                                         list_id             INT NOT NULL REFERENCES flashcard_list(id) ON DELETE CASCADE,

    -- SRS fields
                                         status              VARCHAR(20) NOT NULL DEFAULT 'new',
    -- 'new' | 'learning' | 'known' | 'ignored'
                                         ease_factor         DECIMAL(4,2) DEFAULT 1.0,
    -- 1.0=Dễ | 0.65=Trung bình | 0.1=Khó | -1=Đã biết/bỏ qua
                                         review_count        INT DEFAULT 0,
                                         last_reviewed_at    TIMESTAMP,
                                         next_review_at      TIMESTAMP,             -- SRS scheduling

                                         UNIQUE (user_id, term_id, list_id)
);

CREATE TABLE user_flashcard_session (
                                        id              SERIAL PRIMARY KEY,
                                        user_id         INT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
                                        list_id         INT NOT NULL REFERENCES flashcard_list(id) ON DELETE CASCADE,
                                        started_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                                        ended_at        TIMESTAMP,
                                        terms_reviewed  INT DEFAULT 0,
                                        terms_new       INT DEFAULT 0
);

CREATE TABLE user_flashcard_review_log (
                                           id              SERIAL PRIMARY KEY,
                                           session_id      INT NOT NULL REFERENCES user_flashcard_session(id) ON DELETE CASCADE,
                                           term_id         INT NOT NULL REFERENCES flashcard_term(id) ON DELETE CASCADE,
                                           user_id         INT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
                                           action_value    DECIMAL(4,2) NOT NULL,     -- 1 | 0.65 | 0.1 | -1
                                           reviewed_at     TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- ============================================
-- INDEXES
-- ============================================

CREATE INDEX idx_term_list_id         ON flashcard_term(list_id);
CREATE INDEX idx_term_display_order   ON flashcard_term(list_id, display_order);
CREATE INDEX idx_progress_user        ON user_flashcard_progress(user_id);
CREATE INDEX idx_progress_next_review ON user_flashcard_progress(user_id, next_review_at);
CREATE INDEX idx_progress_status      ON user_flashcard_progress(user_id, list_id, status);
CREATE INDEX idx_review_log_session   ON user_flashcard_review_log(session_id);
CREATE INDEX idx_enrolled_user        ON user_flashcard_list(user_id);

-- 1. Cài đặt chế độ review — trên trang có nút "Cài đặt chế độ review".
-- Cần lưu preferences của user như số từ mới mỗi ngày, thứ tự hiển thị (ngẫu nhiên hay tuần tự), hiển thị mặt trước là EN hay VI. Cần thêm table:

CREATE TABLE user_flashcard_settings (
                                         user_id             INT REFERENCES users(id),
                                         list_id             INT REFERENCES flashcard_list(id),
                                         daily_new_limit     INT DEFAULT 20,
                                         shuffle             BOOLEAN DEFAULT TRUE,
                                         front_side          VARCHAR(10) DEFAULT 'word',  -- 'word' | 'definition'
                                         show_all_terms      BOOLEAN DEFAULT FALSE,
    -- Khi TRUE: hiển thị tất cả từ kể cả ignored
    -- Khi FALSE: từ ignored sẽ bị bỏ qua cho đến khi hết từ cần ôn
                                         PRIMARY KEY (user_id, list_id)
);

-- cho user tạo list riêng
ALTER TABLE flashcard_list ADD COLUMN is_public BOOLEAN DEFAULT TRUE;
