/**
 * api.js - 서버 통신 전담 모듈
 */

export let Api = {
    // 기본 경로 반환
    getMainPath() {
        return location.protocol + "//" + location.hostname + (location.port ? ':' + location.port : '');
    },

    // CSRF 토큰 가져오기
    getCsrfToken() {
        const meta = document.querySelector('meta[name="_csrf"]');
        return meta ? meta.getAttribute('content') : '';
    },

    async request(url, method = 'GET', body = null, headers = {}) {
        // [수정] URL이 /로 시작하지 않으면 자동으로 붙여줌
        const targetUrl = url.startsWith('/') ? url : '/' + url;

        const defaultHeaders = { 'X-CSRF-TOKEN': this.getCsrfToken() };
        const config = { method, headers: { ...defaultHeaders, ...headers } };

        if (body) {
            if (body instanceof FormData) config.body = body;
            else {
                config.headers['Content-Type'] = 'application/json';
                config.body = JSON.stringify(body);
            }
        }

        try {
            const response = await fetch(targetUrl, config);
            if (!response.ok) throw new Error(`HTTP Error: ${response.status}`);

            const contentType = response.headers.get("content-type");
            if (contentType && contentType.includes("application/json")) {
                return await response.json();
            }
            return await response.text();
        } catch (error) {
            console.error(`API Fail [${method} ${targetUrl}]:`, error);
            throw error;
        }
    },

    async postEncrypted(url, type, dataObj, key) {
        // [수정] 암호화(encrypt)를 호출하지 않고 바로 JSON을 Base64로 인코딩만 합니다.
        const dataStr = JSON.stringify(dataObj);

        // 백엔드 extractModelData 구조와 맞추기 위해 Base64 인코딩만 수행
        const base64Payload = btoa(unescape(encodeURIComponent(dataStr)));

        const response = await fetch(url, {
            method: 'POST',
            headers: {
                'Content-Type': 'text/plain', // 기존 규격 유지
                'X-CSRF-TOKEN': this.getCsrfToken()
            },
            body: base64Payload
        });

        if (!response.ok) throw new Error('Network response was not ok');
        return await response.json();
    }
};