import { Api } from './api.js';
import { UI } from './ui.js';

/**
 * game.js - 게임 랭킹 및 공통 로직
 */

export let Game = {

    /**
     * 랭킹 등록 (통합 API)
     */
    async submitRank(gameType, contextId, playerName, primaryScore, secondaryScore = null) {
        const rankDto = {
            gameType, contextId, playerName, primaryScore, secondaryScore
        };

        try {
            const response = await fetch('/api/ranks/submit', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                    'X-CSRF-TOKEN': Api.getCsrfToken()
                },
                body: JSON.stringify(rankDto)
            });

            if (!response.ok) {
                const msg = await response.text();
                throw new Error(msg || '랭킹 등록 실패');
            }
            return await response.json();
        } catch (e) {
            throw e;
        }
    },

    /**
     * 랭킹 목록 조회
     */
    async fetchRanks(gameType, contextId = null) {
        const contextParam = contextId ? `&contextId=${contextId}` : '';
        const url = `/api/ranks/list?gameType=${gameType}${contextParam}`;
        return await Api.request(url);
    },

    /**
     * 게임 성공 시 결과 모달 표시
     */
    async showSuccessModal(options) {
        const { gameType, contextId, successMessage, primaryScore, secondaryScore } = options;

        const modal = document.getElementById('unified-game-success-modal');
        const messageEl = document.getElementById('ugsm-message');
        const rankingListEl = document.getElementById('ugsm-ranking-list');
        const guestArea = document.getElementById('ugsm-guest-ranking');
        const userArea = document.getElementById('ugsm-user-ranking');

        if (!modal) {
            console.error('Game success modal not found in DOM.');
            return;
        }

        // 메시지 설정
        messageEl.textContent = successMessage;

        // 랭킹 로딩
        rankingListEl.innerHTML = '<li>로딩 중...</li>';
        try {
            const ranks = await this.fetchRanks(gameType, contextId);
            rankingListEl.innerHTML = '';

            if (ranks && ranks.length > 0) {
                ranks.forEach((rank, index) => {
                    const li = document.createElement('li');
                    li.innerHTML = `<span>${index + 1}. ${rank.playerName}</span> <strong>${this.formatScore(rank.primaryScore, gameType)}</strong>`;
                    rankingListEl.appendChild(li);
                });
            } else {
                rankingListEl.innerHTML = '<li>아직 등록된 랭킹이 없습니다.</li>';
            }
        } catch (e) {
            rankingListEl.innerHTML = '<li>랭킹 로드 실패</li>';
        }

        // 로그인 상태 체크 (전역 변수 currentUser 사용)
        if (window.currentUser && window.currentUser.isLoggedIn) {
            guestArea.style.display = 'none';
            userArea.style.display = 'block';

            // 자동 등록 시도
            this.submitRank(gameType, contextId, window.currentUser.username, primaryScore, secondaryScore)
                .then(() => userArea.innerHTML = '<p style="color: green;">랭킹이 등록되었습니다.</p>')
                .catch(() => userArea.innerHTML = '<p style="color: red;">자동 등록 실패</p>');
        } else {
            guestArea.style.display = 'block';
            userArea.style.display = 'none';

            this.setupGuestSaveButton(gameType, contextId, primaryScore, secondaryScore);
        }

        // 모달 열기 (UI 모듈 사용)
        UI.openPopup('#unified-game-success-modal');
    },

    /**
     * 비로그인 사용자용 저장 버튼 설정
     */
    setupGuestSaveButton(gameType, contextId, primaryScore, secondaryScore) {
        const saveBtn = document.getElementById('ugsm-save-score-btn');
        const nameInput = document.getElementById('ugsm-player-name');

        // 기존 리스너 제거를 위해 노드 복제
        const newBtn = saveBtn.cloneNode(true);
        saveBtn.parentNode.replaceChild(newBtn, saveBtn);

        newBtn.addEventListener('click', async () => {
            const name = nameInput.value.trim();
            if (!name) {
                UI.showAlert('알림', '이름을 입력해주세요.');
                return;
            }

            newBtn.disabled = true;
            newBtn.textContent = '저장 중...';

            try {
                await this.submitRank(gameType, contextId, name, primaryScore, secondaryScore);
                UI.showAlert('성공', '랭킹이 등록되었습니다!');
                UI.closePopup();
            } catch (e) {
                UI.showAlert('실패', e.message);
                newBtn.disabled = false;
                newBtn.textContent = '점수 저장';
            }
        });
    },

    /**
     * 점수 포맷팅
     */
    formatScore(score, gameType) {
        if (['SUDOKU', 'NONOGRAM','SPIDER'].includes(gameType)) {
            const m = Math.floor(score / 60).toString().padStart(2, '0');
            const s = (score % 60).toString().padStart(2, '0');
            return `${m}:${s}`;
        }
        return `${score} 점`;
    }
};