import { createRouter, createWebHistory } from 'vue-router';
import HomeView from '../views/HomeView.vue';
// Импортируем функцию useAuth для проверки аутентификации
import { useAuth } from '../auth';

const routes = [
  {
    path: '/',
    name: 'Home',
    component: HomeView,
  },
  {
    path: '/login',
    name: 'Login',
    component: () => import('../views/LoginView.vue'),
  },
  {
    path: '/register',
    name: 'Register',
    component: () => import('../views/RegisterView.vue'),
  },
  {
    path: '/profile',
    name: 'Profile',
    component: () => import('../views/ProfileView.vue'), 
    meta: { requiresAuth: true } 
  },
  {
    path: '/swipe',
    name: 'Swipe',
    component: () => import('../views/SwipeView.vue'),
    meta: { requiresAuth: true } // Помечаем, что этот маршрут требует аутентификации
  },
  {
    path: '/chats', // Список всех чатов
    name: 'ChatList',
    component: () => import('../views/ChatListView.vue'),
    meta: { requiresAuth: true }
  },
  {
    path: '/chat/:conversationId', // Конкретный чат
    name: 'ChatView',
    component: () => import('../views/ChatView.vue'), // Мы создадим этот компонент позже
    meta: { requiresAuth: true },
    props: true // Позволяет передавать :conversationId как пропс в компонент
  },
  {
    path: '/user/:userId', // Просмотр профиля пользователя
    name: 'UserProfile',
    component: () => import('../views/UserProfileView.vue'),
    meta: { requiresAuth: true },
    props: true // Позволяет передавать :userId как пропс в компонент
  },
  {
    path: '/preferences', // Настройки предпочтений поиска
    name: 'Preferences',
    component: () => import('../views/PreferencesView.vue'),
    meta: { requiresAuth: true }
  }
  // ... здесь будут другие маршруты: /profile, /swipe, /chat/:id и т.д.
];

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

// Добавляем навигационный guard для проверки аутентификации
router.beforeEach(async (to, from, next) => {
  const { isAuthenticated, token, user, fetchUser } = useAuth(); // Получаем функции и состояния аутентификации
  
  // Проверяем наличие токена в localStorage
  const hasToken = !!token.value;
  
  // Если есть токен в localStorage и нет данных пользователя, пробуем загрузить данные
  if (hasToken && !user.value) {
    console.log('[Router Guard] Найден токен, но нет данных пользователя. Загружаем данные...');
    try {
      await fetchUser();
    } catch (error) {
      console.error('[Router Guard] Ошибка при загрузке данных пользователя:', error);
    }
  }

  // Проверяем требования маршрута к авторизации
  if (to.meta.requiresAuth) {
    if (isAuthenticated.value) {
      console.log(`[Router Guard] Доступ к ${to.path} разрешен. Пользователь аутентифицирован.`);
      next(); // Пользователь аутентифицирован, можно продолжать навигацию
    } else {
      // Если пользователь не аутентифицирован и страница требует авторизации
      console.log(`[Router Guard] Доступ к ${to.path} запрещен. Пользователь не аутентифицирован. Перенаправление на /login.`);
      next({ name: 'Login' });
    }
  } 
  else if ((to.name === 'Login' || to.name === 'Register') && isAuthenticated.value) {
    // Если пользователь уже аутентифицирован и пытается зайти на страницы авторизации
    console.log(`[Router Guard] Пользователь аутентифицирован. Перенаправление с ${to.path} на /swipe.`);
    next({ name: 'Swipe' }); // Перенаправляем на страницу свайпов вместо главной для лучшего UX
  }
  else {
    // Другие страницы, не требующие авторизации
    next();
  }
});

// Убедимся, что экспорт работает правильно
export { router };
export default router;