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 }
  },
  // Страница блокировки устройства
  {
    path: '/device-blocked',
    name: 'DeviceBlocked',
    component: () => import('../views/DeviceBlockedView.vue'),
  },
  // Маршруты для админ-панели
  {
    path: '/admin',
    name: 'AdminDashboard',
    component: () => import('../views/admin/AdminDashboard.vue'),
    meta: { requiresAuth: true, requiresAdmin: true },
    redirect: { name: 'AdminUsers' },
    children: [
      {
        path: 'users',
        name: 'AdminUsers',
        component: () => import('../views/admin/AdminUsers.vue'),
        meta: { requiresAuth: true, requiresAdmin: true }
      },
      {
        path: 'users/:id',
        name: 'AdminUserDetail',
        component: () => import('../views/admin/AdminUserDetail.vue'),
        meta: { requiresAuth: true, requiresAdmin: true },
        props: true
      },
      {
        path: 'conversations',
        name: 'AdminConversations',
        component: () => import('../views/admin/AdminConversations.vue'),
        meta: { requiresAuth: true, requiresAdmin: true }
      },
      {
        path: 'conversations/:id',
        name: 'AdminConversationDetail',
        component: () => import('../views/admin/AdminConversationDetail.vue'),
        meta: { requiresAuth: true, requiresAdmin: true },
        props: true
      },
      {
        path: 'statistics',
        name: 'AdminStatistics',
        component: () => import('../views/admin/AdminStatistics.vue'),
        meta: { requiresAuth: true, requiresAdmin: true }
      },
      {
        path: 'reports',
        name: 'AdminReports',
        component: () => import('../views/admin/AdminReports.vue'),
        meta: { requiresAuth: true, requiresAdmin: true }
      },
      {
        path: 'reports/:id',
        name: 'AdminReportDetail',
        component: () => import('../views/admin/AdminReportDetail.vue'),
        meta: { requiresAuth: true, requiresAdmin: true },
        props: true
      },
      {
        path: 'blocked-devices',
        name: 'AdminBlockedDevices',
        component: () => import('../views/admin/AdminBlockedDevices.vue'),
        meta: { requiresAuth: true, requiresAdmin: true }
      }
    ]
  }
  // ... здесь будут другие маршруты: /profile, /swipe, /chat/:id и т.д.
];

const router = createRouter({
  history: createWebHistory('/'),
  routes,
});

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

  // Проверка прав администратора для доступа к админ-маршрутам
  if (to.meta.requiresAdmin && (!user.value || !user.value.isAdmin)) {
    console.log(`[ROUTER GUARD] Доступ к ${to.path} запрещен. Требуются права администратора.`);
    console.log('[ROUTER GUARD] Текущий пользователь:', user.value);
    console.log('[ROUTER GUARD] isAdmin:', user.value?.isAdmin);
    return next({ name: 'Swipe' }); // Перенаправление на обычную страницу пользователей
  }

  // Проверяем требования маршрута к авторизации
  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) {
    // Если пользователь уже аутентифицирован и пытается зайти на страницы авторизации
    if (user.value && user.value.isAdmin) {
      console.log(`[ROUTER GUARD] Админ аутентифицирован. Перенаправление с ${to.path} на админ-панель.`);
      console.log('[ROUTER GUARD] isAdmin:', user.value.isAdmin);
      next({ name: 'AdminDashboard' }); // Перенаправляем на админ-панель для админа
    } else {
      console.log(`[ROUTER GUARD] Пользователь аутентифицирован. Перенаправление с ${to.path} на /swipe.`);
      next({ name: 'Swipe' }); // Перенаправляем на страницу свайпов для обычных пользователей
    }
  }
  else {
    // Другие страницы, не требующие авторизации
    next();
  }
});

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