import { createRouter, createWebHistory } from 'vue-router';
import { useAuthStore } from '@s/useAuthStore';
import { useUserInfoStore } from '@s/useUserInfoStore';

// 초기 렌더링 속도를 위해 지연 로딩 사용
const routes = [
    {
        path: '/',
        name: 'Home',
        component: () => import('@v/MainView.vue'),
        meta: { requiresAuth: true }
    },
    {
        path: '/board',
        component: () => import('@v/board/TheBoard.vue'),
        meta: { requiresAuth: true },
        children: [
            {
                path: '',
                name: 'BoardList',
                component: () => import('@v/board/BoardList.vue'),
            },
            {
                path: 'write',
                component: () => import('@v/board/BoardWrite.vue'),
            },
            {
                path: ':id',
                name: 'BoardDetail',
                component: () => import('@v/board/BoardView.vue'),
            },
            {
                path: 'edit/:id',
                name: 'BoardEdit',
                component: () => import('@v/board/BoardEdit.vue'),
            },
        ],
    },
    {
        path: '/wordDict',
        component: () => import('@v/wordDict/wordDict.vue'),
        meta: { requiresAuth: true }
    },
    {
        path: '/login',
        name: 'Login',
        component: () => import('@v/user/TheLogin.vue'),
        meta: { layout: 'NoLayout', requiresGuest: true },
    },
    {
        path: '/register',
        name: 'Register',
        component: () => import('@v/user/TheRegister.vue'),
        meta: { layout: 'NoLayout', requiresGuest: true },
    },
    {
        path: '/pw',
        name: 'Password',
        component: () => import('@v/user/ThePassword.vue'),
        meta: { layout: 'NoLayout', requiresGuest: true },
    },
    {
        path: '/vacation',
        component: () => import('@v/vacation/VacationManagement.vue'),
        meta: { requiresAuth: true }
    },
    {
        path: '/voteboard',
        component: () => import('@v/voteboard/TheVoteBoard.vue'),
        meta: { requiresAuth: true },
        children: [
            {
                path: '',
                component: () => import('@v/voteboard/voteBoardList.vue'),
            },
            {
                path: 'write',
                component: () => import('@v/voteboard/voteboardWrite.vue'),
            },
        ],
    },
    {
        path: '/projectlist',
        component: () => import('@v/projectlist/TheProjectList.vue'),
        meta: { requiresAuth: true }
    },
    {
        path: '/commuters',
        component: () => import('@v/commuters/TheCommuters.vue'),
        meta: { requiresAuth: true }
    },
    {
        path: '/authorization',
        component: () => import('@v/admin/TheAuthorization.vue'),
        meta: { requiresAuth: true },
    },
    {
        path: '/error/400',
        name: 'Error400',
        component: () => import('@v/error/Error400.vue'),
        meta: { layout: 'NoLayout' },
    },
    {
        path: '/error/500',
        name: 'Error500',
        component: () => import('@v/error/Error500.vue'),
        meta: { layout: 'NoLayout' },
    },
    {
        path: '/:anything(.*)',
        name: 'Error404',
        component: () => import('@v/error/Error404.vue'),
        meta: { layout: 'NoLayout' },
    },
];

const router = createRouter({
    history: createWebHistory(import.meta.env.BASE_URL),
    routes: routes,
});

router.beforeEach(async (to, from, next) => {
    const authStore = useAuthStore();
    await authStore.checkAuthStatus(); // 로그인 상태 확인
    const allowedUserId = 1; // 특정 ID (변경필요!!)
    const userStore = useUserInfoStore();
    const userId = userStore.user?.id ?? null;

    // 로그인이 필요한 페이지인데 로그인되지 않은 경우 → 로그인 페이지로 이동
    if (to.meta.requiresAuth && !authStore.isAuthenticated) {
        return next({ name: 'Login', query: { redirect: to.fullPath } });
    }

    // Authorization 페이지는 ID가 26이 아니면 접근 차단
    if (to.path === '/authorization' && userId !== allowedUserId) {
        return next('/');
    }

    // 비로그인 사용자만 접근 가능한 페이지인데 로그인된 경우 → 홈으로 이동
    if (to.meta.requiresGuest && authStore.isAuthenticated) {
        return next({ name: 'Home' });
    }

    // 모든 조건을 통과하면 정상적으로 이동
    next();
});

import axios from 'axios';

axios.interceptors.response.use(
    response => response,
    error => {
        const status = error.response?.status;

        if (status === 400) {
            router.push({ name: 'Error400' });
        } else if (status === 500) {
            router.push({ name: 'Error500' });
        }

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

export default router;
