/**
 * common.js - 메인 엔트리 포인트 (통합본)
 */
import { Api } from './modules/api.js';
import { UI } from './modules/ui.js';
import { Editor } from './modules/editor.js';
import { Game } from './modules/game.js';
import { Stats } from './modules/stats.js';
import { ThemeManager } from './modules/theme.js';

// --- 1. 전역 객체 및 함수 연결 (HTML 호환성 유지) ---
window.Api = Api;
window.UI = UI;
window.Editor = Editor;
window.Game = Game;
window.Stats = Stats;
window.ThemeManager = ThemeManager;

// UI 모듈 함수 연결
window.showAlert = UI.showAlert;
window.showConfirm = UI.showConfirm;

// --- 2. 전역 상태 변수 ---
window.baseData = {
    'id': "", 'originId': "", 'title': "", 'content': "", 'category': "none", 'tags': "",
    'writeTime': 0, 'modifyTime': 0, 'firstPostLat': 0.0, 'firstPostLon': 0.0, 'firstAddress': "",
    'modifyLat': 0.0, 'modifyLon': 0.0, 'modifyAddress': "", 'writer': "", 'posting': false,
    'readCount': 0, 'voteCount': 0, 'unlikeCount': 0
};
window.currentLat = 0.0;
window.currentLon = 0.0;
window.stagedCategory = 'none';
window.stagedHashtags = [];
window.currentReplyParentId = null; // 대댓글용 부모 ID

// --- 3. DOMContentLoaded 초기화 ---
window.addEventListener('DOMContentLoaded', () => {
    console.log("Common JS (Complete Version) Loaded");

    // 3-1. 서버 데이터 로드
    if (typeof serverData !== 'undefined') {
        Object.assign(window.baseData, serverData);
    }

    // 3-2. 테마 초기화
    ThemeManager.init();

    // 3-3. 에디터 초기화
    if (document.getElementById('editor')) {
        const isEditMode = location.pathname.includes('/edit') || location.pathname.includes('/write');
        Editor.init(isEditMode, window.baseData);

        // 새 글 작성 시 위치 정보 가져오기
        if (isEditMode && !window.baseData.id) {
            getLocation();
        }
    }

    // 3-4. 이벤트 바인딩
    bindGlobalEvents();

    // 3-5. 기타 초기화
    checkUnreadMessages();

    // 방문자 통계 (푸터가 있는 경우)
    if (document.getElementById('visitor-total')) {
        Stats.fetchVisitorStats();
    }

    // 사이드바 랭킹/최신글 (존재 시)
    if (document.querySelector(".rank_of_view")) fetchRankOfViews();
    if (document.querySelector(".recent_posts")) fetchRecentPosts();
});

// --- 4. 이벤트 바인딩 함수 ---
function bindGlobalEvents() {
    // 팝업 닫기 (공통)
    document.querySelectorAll('.btn_layerClose, .dim_layer').forEach(el => {
        el.addEventListener('click', (e) => {
            e.preventDefault();
            UI.closePopup();
        });
    });

    // 로그인/회원가입 팝업 트리거 (URL 파라미터 & 버튼)
    const urlParams = new URLSearchParams(window.location.search);
    if (urlParams.get('action') === 'login') UI.openPopup('#loginPopup');
    if (urlParams.get('action') === 'signup') UI.openPopup('#signupPopup');

    document.querySelectorAll('.open-login-popup').forEach(btn => {
        btn.addEventListener('click', () => UI.openPopup('#loginPopup'));
    });

    // 로그인 폼 제출
    const loginForm = document.getElementById('loginFormElement');
    if (loginForm) {
        loginForm.addEventListener('submit', (e) => {
            e.preventDefault();
            submitLoginForm();
        });
    }

    // 회원가입 전환 버튼
    const toSignupBtn = document.getElementById('openSignupBtnFromLogin');
    if (toSignupBtn) {
        toSignupBtn.addEventListener('click', () => {
            UI.closePopup();
            UI.openPopup('#signupPopup');
        });
    }

    // 저장 버튼 (에디터)
    const saveBtn = document.getElementById('save');
    if (saveBtn) {
        saveBtn.addEventListener('click', saveData);
    }

    // 댓글 등록 버튼
    const commentSubmitBtn = document.getElementById('submit-comment');
    if (commentSubmitBtn) {
        commentSubmitBtn.addEventListener('click', (e) => {
            e.preventDefault();
            if (!window.currentUser || !window.currentUser.isLoggedIn) {
                return UI.showAlert("알림", "로그인이 필요합니다.");
            }
            submitComment();
        });
    }
}

/* ============================================= */
/* --- 5. 주요 기능 구현 (누락된 기능 복구) --- */
/* ============================================= */

/** [네비게이션] 페이지 이동 함수들 (window에 등록) */
window.getMainPath = () => location.protocol + "//" + location.hostname + (location.port ? ':' + location.port : '');
window.gotoHome = () => location.href = '/home.bs';
window.gotoWrite = () => location.href = '/blog/edit';
window.gotoModify = () => location.href = '/blog/posts';
window.gotoWhere = () => location.href = '/bums/where.bs';
window.gotoBUMSpace = () => location.href = '/bums/face.bs';
window.gotoJoin = () => location.href = '/user/join.bs';
window.gotoPuzzleUpload = () => location.href = '/puzzle/upload.html'; // .bs -> .html 확인 필요
window.gotoSudoKuGen = () => location.href = '/puzzle/sudoku_gen.html';

// 리스트에서 글 클릭 시 이동
window.goToViewer = function(element) {
    if (element && element.id) location.href = `/blog/viewer/${element.id}`;
};

/** [인증] 로그인 처리 */
window.submitLoginForm = async function() {
    const data = {
        'user_id': document.getElementById('loginId').value,
        'user_pw': document.getElementById('loginPassword').value,
        'rememberMe': document.getElementById('rememberMe').checked
    };

    try {
        const response = await Api.postEncrypted('/user/login.bjx', serverData.enc, data, serverData.keyword);
        if (response.isOk) {
            location.reload();
        } else {
            UI.showAlert('로그인 실패', response.resultMsg);
        }
    } catch (e) {
        console.error(e);
        UI.showAlert('오류', '로그인 요청 중 오류가 발생했습니다.');
    }
};

/** [인증] 로그아웃 처리 */
window.logout = function() {
    const form = document.createElement('form');
    form.method = 'POST';
    form.action = '/user/logout.bs';

    const csrfInput = document.createElement('input');
    csrfInput.type = 'hidden';
    csrfInput.name = document.querySelector('meta[name="_csrf_parameter"]').getAttribute('content');
    csrfInput.value = Api.getCsrfToken();

    form.appendChild(csrfInput);
    document.body.appendChild(form);
    form.submit();
};

/** [게시물] 저장 처리 */
async function saveData() {
    const saveBtn = document.getElementById('save');
    if (saveBtn) { saveBtn.disabled = true; saveBtn.innerText = "저장 중..."; }

    try {
        // Quill 내용 가져오기
        const content = JSON.stringify(Editor.getCookies());

        // 전송 데이터 구성
        const dataToSend = { ...window.baseData };
        dataToSend.content = encodeURIComponent(content);
        dataToSend.title = encodeURIComponent(document.getElementById('title_field')?.value || dataToSend.title);
        dataToSend.category = encodeURIComponent(dataToSend.category || 'none');
        dataToSend.tags = encodeURIComponent(dataToSend.tags || '');
        dataToSend.posting = document.getElementById('post-published-switch')?.checked || false;

        // 수동 입력 필드 (날짜/좌표) 처리
        const manualDate = document.getElementById('manual_date')?.value;
        if (manualDate) dataToSend.writeTime = new Date(manualDate).getTime();

        // 좌표 처리 로직 (수동 입력 우선, 없으면 현재 위치)
        const mLat = document.getElementById('manual_lat')?.value;
        const mLon = document.getElementById('manual_lon')?.value;
        if (mLat && mLon) {
            dataToSend.modifyLat = parseFloat(mLat);
            dataToSend.modifyLon = parseFloat(mLon);
            dataToSend.modifyAddress = '';
            if (!dataToSend.id) {
                dataToSend.firstPostLat = parseFloat(mLat);
                dataToSend.firstPostLon = parseFloat(mLon);
                dataToSend.firstAddress = '';
            }
        } else {
            // 현재 위치(getLocation으로 갱신된 값) 사용
            dataToSend.modifyLat = window.currentLat;
            dataToSend.modifyLon = window.currentLon;
            if(!dataToSend.id) {
                dataToSend.firstPostLat = window.currentLat;
                dataToSend.firstPostLon = window.currentLon;
            }
        }

        if (await UI.showConfirm("확인", "저장하시겠습니까?")) {
            const res = await Api.postEncrypted('/blog/post.bjx', serverData.enc, dataToSend, serverData.keyword);

            if (res.resultCode === 0 && res.data?.postId) {
                await UI.showAlert("성공", "저장되었습니다.");
                location.href = `/blog/viewer/${res.data.postId}`;
            } else {
                throw new Error(res.resultMsg);
            }
        } else {
            if (saveBtn) { saveBtn.disabled = false; saveBtn.innerText = "저장하기"; }
        }
    } catch (e) {
        console.error(e);
        UI.showAlert("오류", "저장 실패: " + e.message);
        if (saveBtn) { saveBtn.disabled = false; saveBtn.innerText = "저장하기"; }
    }
}

/** [게시물] 삭제 처리 */
window.deleteCurrentPost = async function(btn) {
    const postId = btn.getAttribute('data-post-id');
    if (!postId) return UI.showAlert("오류", "삭제할 수 없는 게시물입니다.");

    if (await UI.showConfirm("삭제", "정말 삭제하시겠습니까?")) {
        try {
            await Api.request(`/blog/post/${postId}`, 'DELETE');
            UI.showAlert("삭제됨", "게시물이 삭제되었습니다.");
            location.href = '/blog/posts';
        } catch (e) {
            UI.showAlert("오류", "삭제 실패: " + e.message);
        }
    }
};

/** [위치] GPS 좌표 가져오기 */
window.getLocation = function() {
    const locationField = document.getElementById('location_field');
    if (!locationField) return;

    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(
            (pos) => {
                window.currentLat = pos.coords.latitude;
                window.currentLon = pos.coords.longitude;
                locationField.innerHTML = `
                    <span class="tag-title">LOCATION</span>
                    <div class="tag-content-wrapper">
                        <div class="tag-item">Lat: ${window.currentLat.toFixed(4)}</div>
                        <div class="tag-item">Lon: ${window.currentLon.toFixed(4)}</div>
                    </div>`;

                // 수동 입력 필드에도 값 채우기
                const mLat = document.getElementById('manual_lat');
                const mLon = document.getElementById('manual_lon');
                if(mLat) mLat.value = window.currentLat.toFixed(6);
                if(mLon) mLon.value = window.currentLon.toFixed(6);
            },
            () => {
                locationField.innerHTML = `<span class="tag-title">LOCATION</span><div>GPS 정보 없음</div>`;
            }
        );
    }
};

/** [댓글] 댓글 등록 */
window.submitComment = async function() {
    const input = document.getElementById('comment-input');
    const content = input?.value.trim();
    if (!content) return UI.showAlert("알림", "내용을 입력하세요.");

    const commentData = {
        content: content,
        parentId: window.currentReplyParentId,
        postId: null // 서버에서 URL로 판단하므로 null 가능
    };

    try {
        await Api.postEncrypted(`/blog/posts/${serverData.id}/comments.bjx`, serverData.enc, commentData, serverData.keyword);
        UI.showAlert("성공", "댓글이 등록되었습니다.");
        input.value = '';
        window.cancelReply(); // 답글 상태 초기화
        window.location.reload(); // 간편하게 새로고침 (또는 fetchComments 재호출)
    } catch (e) {
        UI.showAlert("오류", "댓글 등록 실패");
    }
};

/** [댓글] 답글 달기 설정 */
window.setReplyTarget = function(commentId, writerName) {
    window.currentReplyParentId = commentId;
    const bar = document.getElementById('reply-status-bar');
    if (bar) {
        bar.style.display = 'flex';
        document.getElementById('reply-status-text').innerText = `@${writerName} 님에게 답글 작성 중`;
        document.getElementById('comment-input').focus();
    }
};

/** [댓글] 답글 취소 */
window.cancelReply = function() {
    window.currentReplyParentId = null;
    const bar = document.getElementById('reply-status-bar');
    if (bar) bar.style.display = 'none';
};

/** [투표] 좋아요/싫어요 */
window.handleVote = async function(btn, type) {
    const container = btn.closest('.vote-controls');
    const postId = container.dataset.postId;

    try {
        const res = await Api.request(`/blog/post/${postId}/${type}.bjx`, 'POST');
        if (res) {
            container.querySelector('.like-count').innerText = res.voteCount;
            container.querySelector('.unlike-count').innerText = res.unlikeCount;
        }
    } catch (e) { console.error(e); }
};

/** [유틸] 읽지 않은 메시지 확인 */
async function checkUnreadMessages() {
    if (!window.currentUser || !window.currentUser.isLoggedIn) return;
    try {
        const res = await Api.request('/messages/unread-count');
        if (res.count > 0) {
            const icon = document.getElementById('message-icon');
            if (icon) icon.style.display = 'inline-block';
        }
    } catch (e) {}
}

/** [유틸] 사이드바 랭킹 로드 */
function fetchRankOfViews() {
    fetch('/blog/rankOfViews.bjx').then(r=>r.json()).then(data => {
        const ul = document.querySelector('.rank_of_view');
        if(ul && data.posts) {
            ul.innerHTML = data.posts.map(p => `<li><a href="/blog/viewer/${p.id}">${p.title}</a></li>`).join('');
        }
    });
}
function fetchRecentPosts() {
    fetch('/blog/recentOfPost.bjx').then(r=>r.json()).then(data => {
        const ul = document.querySelector('.recent_posts');
        if(ul && data.posts) {
            ul.innerHTML = data.posts.map(p => `<li><a href="/blog/viewer/${p.id}">${p.title}</a></li>`).join('');
        }
    });
}

/** [북마크] 팝업 열기 (기존 함수 호환) */
window.openBookmarkEditPopup = function(btn) {
    // 구현 필요 시 북마크 관련 로직 추가 (분량상 생략되었으나 필요하면 추가 요청해주세요)
    UI.showAlert("알림", "북마크 수정 기능 준비 중");
};
window.openBookmarkCategoryPopup = () => UI.showAlert("알림", "카테고리 기능 준비 중");
window.openBookmarkTagPopup = () => UI.showAlert("알림", "태그 기능 준비 중");

async function submitStockConfig() {
    const data = {
        appKey: document.getElementById('kis_app_key').value,
        appSecret: document.getElementById('kis_app_secret').value,
        accountNo: document.getElementById('kis_account_no').value
    };

    try {
        // CSRF 토큰을 포함한 POST 요청
        const res = await Api.request('/api/stock/config', 'POST', data);
        if (res.resultCode === 0) {
            UI.showAlert("연결 성공", "세션이 유지되는 동안 API를 사용할 수 있습니다.");
            location.href = "/stock/dashboard.bs";
        } else {
            UI.showAlert("실패", res.resultMsg);
        }
    } catch (e) {
        UI.showAlert("오류", "서버 통신 중 에러가 발생했습니다.");
    }
}

async function checkKisSession() {
    // 세션에 KIS_AUTH가 있는지 확인하는 간단한 API 호출
    const res = await Api.request('/api/stock/session-check');
    if (res.resultCode !== 0) {
        UI.showAlert("알림", "API 키 설정이 필요합니다.");
        location.href = "/stock/config.bs";
    }
}