import axios from 'axios';
import router from '@/router';
import { useToastStore } from '@s/toastStore';
import { useLoadingStore } from '@s/loadingStore';

const $api = axios.create({
    baseURL: import.meta.env.VITE_API_URL,
    timeout: 300000,
    withCredentials: true,
});

/**
 * Default Content-Type : json
 * form 사용 시 옵션에 { isFromDate : true } 추가
 */
$api.interceptors.request.use(
    function (config) {
        const loadingStore = useLoadingStore();
        loadingStore.startLoading();

        let contentType = 'application/json';

        if (config.isFormData) contentType = 'multipart/form-data';

        config.headers['Content-Type'] = contentType;
        config.headers['X-Requested-With'] = 'XMLHttpRequest';

        return config;
    },
    function (error) {
        const loadingStore = useLoadingStore();
        loadingStore.stopLoading();
        // 요청 오류가 있는 작업 수행
        return Promise.reject(error);
    },
);

// 응답 인터셉터 추가하기
$api.interceptors.response.use(
    function (response) {
        const loadingStore = useLoadingStore();
        loadingStore.stopLoading();


        // 로그인 요청일 경우 (헤더에 isLogin이 true로 설정된 경우)
        if (response.config.headers && response.config.headers.isLogin) {
            return response;
        }

        // 테스트 부탁
        // 로그인 실패, 커스텀 에러 응답 처리
        if (response.data.code > 10000) {
            const toastStore = useToastStore();
            const errorCode = response.data.code;
            const errorMessage = response.data.message || '알 수 없는 오류가 발생했습니다.';

            // 서버에서 보낸 메시지 사용
            toastStore.onToast(errorMessage, 'e');

            // 특정 에러 코드에 대한 추가 처리만 수행
            if (errorCode === 10001) {
                router.push('/login');
            }

            // 오류 응답 반환
            return response;
        }

        // 일반 성공 응답 처리
        return response;
    },
    function (error) {
        const loadingStore = useLoadingStore();
        loadingStore.stopLoading();
        const toastStore = useToastStore();

        // 로그인 요청 별도 처리 (헤더에 isLogin이 true로 설정된 경우)
        if (error.config && error.config.headers && error.config.headers.isLogin) {
            // 로그인 페이지 오류 토스트 메시지 표시 X
            return Promise.reject(error);
        }

        // 에러 응답에 커스텀 메시지가 포함되어 있다면 해당 메시지 사용
        // if (error.response && error.response.data && error.response.data.message) {
        //     toastStore.onToast(error.response.data.message, 'e');
        // } else if (error.response) {
        if (error.response) {
            // 기본 HTTP 에러 처리
            switch (error.response.status) {
                case 400:
                    toastStore.onToast('잘못된 요청입니다.', 'e');
                    router.push('/error/400');
                    break;
                case 401:
                    toastStore.onToast('인증이 필요합니다.', 'e');
                    router.push('/login');
                    break;
                case 403:
                    toastStore.onToast('접근 권한이 없습니다.', 'e');
                    break;
                case 404:
                    toastStore.onToast('요청한 페이지를 찾을 수 없습니다.', 'e');
                    router.push('/error/404');
                    break;
                case 500:
                    toastStore.onToast('서버 오류가 발생했습니다.', 'e');
                    router.push('/error/500');
                    break;
                default:
                    toastStore.onToast('알 수 없는 오류가 발생했습니다.', 'e');
            }
        } else if (error.request) {
            toastStore.onToast('서버와 통신할 수 없습니다.', 'e');
        } else {
            toastStore.onToast('요청 중 오류가 발생했습니다.', 'e');
        }

        return Promise.reject(error);
    },
);


export default $api;
