-- =============================================================================
-- bibimbap dev seed — 리뷰/댓글(W3-2) 기능 테스트용 더미 상황
-- =============================================================================
-- 목적: 새로 추가된 게임 리뷰/댓글 기능을 실제로 테스트할 수 있는 더미 데이터.
--   1) 로그인 가능한 테스트 계정 1개 (직접 로그인 → 리뷰/댓글 작성 테스트용)
--   2) 표시되는 더미 게임 1개 (테스트 계정 소유)
--   3) 이미 등록된 더미 리뷰 5개 (각자 다른 더미 유저 — game당 user 1리뷰 제약 때문)
--   + 보너스: 더미 댓글 3개
--
-- 멱등(idempotent): 같은 이메일/게임명 기준 NOT EXISTS 가드 → 재실행해도 중복 미생성.
--
-- 적용 (가동중인 컨테이너):
--   docker exec -i bibimbap-db psql -U bibimbap -d bibimbap -v ON_ERROR_STOP=1 < db/seed-dev.sql
-- 적용 (호스트 psql, 포트 5433):
--   PGPASSWORD=change_me_local_dev psql -h localhost -p 5433 -U bibimbap -d bibimbap -f db/seed-dev.sql
--
-- 로그인 자격: tester@bibimbap.local / test1234!  (provider='email')
--   password_hash 는 UserController.hashPassword 와 동일 알고리즘으로 사전 생성:
--   PBKDF2WithHmacSHA256 / 210000 iter / 256-bit key / 16-byte salt,
--   포맷 = pbkdf2_sha256$<iter>$<base64 salt>$<base64 hash>.
--
-- 되돌리기 (이 더미만 정리):  db/seed-dev-teardown.sql 참고.
-- =============================================================================

SET search_path TO dev;

DO $$
DECLARE
    v_tester_id bigint;
    v_game_id   bigint;
    v_uid       bigint;
    -- test1234! 의 사전 생성 해시 (위 알고리즘과 동일).
    c_pw_hash   text := 'pbkdf2_sha256$210000$QJ5MV+dx3aECELuuh3ibIA==$/59CO6JWXXGXWW0hzqpnZwu89qirDozP0jlq3JzEwZw=';
    r           RECORD;
BEGIN
    -- -------------------------------------------------------------------------
    -- 1) 로그인 테스트 계정 (users + email identity)
    -- -------------------------------------------------------------------------
    SELECT id INTO v_tester_id
    FROM users
    WHERE canonical_email = 'tester@bibimbap.local' AND is_delete IS NOT TRUE
    LIMIT 1;

    IF v_tester_id IS NULL THEN
        INSERT INTO users (display_name, canonical_email, role, status)
        VALUES ('테스터', 'tester@bibimbap.local', 'USER', 'ACTIVE')
        RETURNING id INTO v_tester_id;
    END IF;

    IF NOT EXISTS (
        SELECT 1 FROM user_auth_identities
        WHERE provider = 'email' AND provider_user_id = 'tester@bibimbap.local'
          AND is_delete IS NOT TRUE
    ) THEN
        INSERT INTO user_auth_identities
            (user_id, provider, provider_user_id, email, password_hash, display_name)
        VALUES
            (v_tester_id, 'email', 'tester@bibimbap.local', 'tester@bibimbap.local', c_pw_hash, '테스터');
    END IF;

    -- -------------------------------------------------------------------------
    -- 2) 더미 게임 (테스트 계정 소유, 목록/상세에 표시되도록 visible)
    --    webgl_path / thumbnail_url 은 NULL — game-detail.jsp 가 빈 src 로 안전 처리.
    -- -------------------------------------------------------------------------
    SELECT id INTO v_game_id
    FROM games
    WHERE name = '테스트 게임 (더미)' AND is_delete IS NOT TRUE
    LIMIT 1;

    IF v_game_id IS NULL THEN
        INSERT INTO games (user_id, name, creator_note, is_visible, sort_order)
        VALUES (
            v_tester_id,
            '테스트 게임 (더미)',
            '리뷰/댓글 기능 테스트용 더미 게임입니다. 자유롭게 리뷰와 댓글을 남겨보세요.',
            true,
            (SELECT COALESCE(MAX(sort_order), 0) + 1 FROM games WHERE is_delete IS NOT TRUE)
        )
        RETURNING id INTO v_game_id;
    END IF;

    -- -------------------------------------------------------------------------
    -- 3) 더미 리뷰어 5명 + 각자 리뷰 1건 (game당 user 1리뷰 unique 제약 충족)
    --    created_at 을 days_ago 만큼 과거로 스태거 → 목록(최신순) 정렬이 자연스럽게.
    -- -------------------------------------------------------------------------
    FOR r IN
        SELECT * FROM (VALUES
            ('김플레이',   'reviewer1@bibimbap.local', 5, '그래픽이 깔끔하고 조작감이 좋아요. 가볍게 즐기기 딱 좋습니다. 추천!', 5),
            ('이도전',     'reviewer2@bibimbap.local', 4, '아이디어가 신선했습니다. 난이도 밸런스만 조금 더 다듬으면 완벽할 듯해요.', 4),
            ('박캐주얼',   'reviewer3@bibimbap.local', 3, '무난하게 즐길 만한 게임. 다만 후반부가 살짝 반복적으로 느껴졌어요.', 3),
            ('최열정',     'reviewer4@bibimbap.local', 5, '시간 가는 줄 모르고 플레이했네요. BGM이 특히 인상적이었습니다!', 2),
            ('정라이트',   'reviewer5@bibimbap.local', 2, '초반 튜토리얼이 불친절해서 적응이 조금 어려웠어요. 보완되면 좋겠습니다.', 1)
        ) AS t(nickname, email, rating, body, days_ago)
    LOOP
        SELECT id INTO v_uid
        FROM users
        WHERE canonical_email = r.email AND is_delete IS NOT TRUE
        LIMIT 1;

        IF v_uid IS NULL THEN
            INSERT INTO users (display_name, canonical_email, role, status)
            VALUES (r.nickname, r.email, 'USER', 'ACTIVE')
            RETURNING id INTO v_uid;
        END IF;

        IF NOT EXISTS (
            SELECT 1 FROM game_reviews
            WHERE game_id = v_game_id AND user_id = v_uid AND is_delete IS NOT TRUE
        ) THEN
            INSERT INTO game_reviews (game_id, user_id, rating, body, created_at, updated_at)
            VALUES (
                v_game_id, v_uid, r.rating, r.body,
                now() - make_interval(days => r.days_ago),
                now() - make_interval(days => r.days_ago)
            );
        END IF;
    END LOOP;

    -- -------------------------------------------------------------------------
    -- 보너스) 더미 댓글 3건 (리뷰어 유저 귀속, created_at ASC 정렬용 스태거)
    -- -------------------------------------------------------------------------
    FOR r IN
        SELECT * FROM (VALUES
            ('reviewer1@bibimbap.local', '오 이거 재밌네요 ㅎㅎ', 3),
            ('reviewer3@bibimbap.local', '다음 업데이트도 기대할게요!', 2),
            ('reviewer5@bibimbap.local', '버그 제보: 가끔 화면이 멈춰요.', 1)
        ) AS t(email, content, days_ago)
    LOOP
        SELECT id INTO v_uid
        FROM users
        WHERE canonical_email = r.email AND is_delete IS NOT TRUE
        LIMIT 1;

        IF v_uid IS NOT NULL AND NOT EXISTS (
            SELECT 1 FROM game_comments
            WHERE game_id = v_game_id AND user_id = v_uid AND content = r.content
              AND is_delete IS NOT TRUE
        ) THEN
            INSERT INTO game_comments (game_id, user_id, nickname, content, created_at)
            VALUES (
                v_game_id, v_uid,
                (SELECT display_name FROM users WHERE id = v_uid),
                r.content,
                now() - make_interval(days => r.days_ago)
            );
        END IF;
    END LOOP;

    RAISE NOTICE 'seed-dev 완료: tester_id=%, game_id=%', v_tester_id, v_game_id;
END $$;

-- 적용 결과 확인용 요약 (psql 실행 시 출력).
SELECT
    (SELECT count(*) FROM users WHERE canonical_email LIKE '%@bibimbap.local' AND is_delete IS NOT TRUE)            AS dummy_users,
    (SELECT count(*) FROM games WHERE name = '테스트 게임 (더미)' AND is_delete IS NOT TRUE)                          AS dummy_games,
    (SELECT count(*) FROM game_reviews r JOIN games g ON g.id = r.game_id
        WHERE g.name = '테스트 게임 (더미)' AND r.is_delete IS NOT TRUE)                                             AS dummy_reviews,
    (SELECT count(*) FROM game_comments c JOIN games g ON g.id = c.game_id
        WHERE g.name = '테스트 게임 (더미)' AND c.is_delete IS NOT TRUE)                                            AS dummy_comments;
