import { createRouter, createWebHistory } from 'vue-router'
import { ElMessage } from 'element-plus'
import store from '@/store'

// 路由组件
import LoginView from '@/views/auth/LoginView.vue'
import RegisterView from '@/views/auth/RegisterView.vue'
import HomeView from '@/views/HomeView.vue'
import ForumView from '@/views/forum/ForumView.vue'
import TopicView from '@/views/forum/TopicView.vue'
import ChatRoom from '@/views/ChatRoom.vue'

const routes = [
  {
    path: '/',
    redirect: '/login'
  },
  {
    path: '/login',
    name: 'Login',
    component: LoginView,
    meta: {
      title: 'PT Tracker - 登录',
      requiresGuest: true
    }
  },
  {
    path: '/register',
    name: 'Register',
    component: RegisterView,
    meta: {
      title: 'PT Tracker - 注册',
      requiresGuest: true
    }
  },
  {
    path: '/home',
    name: 'Home',
    component: HomeView,
    meta: {
      title: 'PT Tracker - 首页',
      requiresAuth: true
    }
  },
  {
    path: '/profile',
    name: 'Profile',
    component: () => import('@/views/auth/ProfileView.vue'),
    meta: {
      title: 'PT Tracker - 个人资料',
      requiresAuth: true
    }
  },
  // 种子相关路由
  {
    path: '/torrents',
    name: 'Torrents',
    component: () => import('@/views/torrent/TorrentsView.vue'),
    meta: {
      title: 'PT Tracker - 种子浏览',
      requiresAuth: true
    }
  },
  {
    path: '/upload',
    name: 'Upload',
    component: () => import('@/views/torrent/UploadView.vue'),
    meta: {
      title: 'PT Tracker - 上传种子',
      requiresAuth: true
    }
  },
  {
    path: '/torrent/:id',
    name: 'TorrentDetail',
    component: () => import('@/views/torrent/TorrentDetailView.vue'),
    meta: {
      title: 'PT Tracker - 种子详情',
      requiresAuth: true
    }
  },
  // 论坛相关路由
  {
    path: '/forum',
    name: 'forum',
    component: ForumView
  },
  {
    path: '/forum/section/:id',
    name: 'ForumSection',
    component: () => import('@/views/forum/ForumSectionView.vue'),
    meta: {
      title: 'PT Tracker - 版块',
      requiresAuth: true
    }
  },
  {
    path: '/forum/topic/:id',
    name: 'topic',
    component: TopicView
  },
  {
    path: '/chat',
    name: 'ChatRoom',
    component: ChatRoom,
    meta: {
      title: 'PT Tracker - 聊天室',
      requiresAuth: true
    }
  },
  // 404页面
  {
    path: '/:pathMatch(.*)*',
    redirect: '/login'
  }
]

const router = createRouter({
  history: createWebHistory(),
  routes
})

// 更新路由守卫
router.beforeEach(async (to, from, next) => {
  // 设置页面标题
  if (to.meta.title) {
    document.title = to.meta.title
  }
  
  console.log(`路由跳转: ${from.path} -> ${to.path}`)
  
  // 恢复登录状态（仅在应用启动时执行一次）
  if (!store.state.auth.isLoggedIn && localStorage.getItem('isLoggedIn') === 'true') {
    store.dispatch('auth/restoreLoginState')
  }
  
  const isLoggedIn = store.getters['auth/isAuthenticated']
  
  // 需要登录但未登录
  if (to.meta.requiresAuth && !isLoggedIn) {
    // 尝试检查服务器端的登录状态
    try {
      const isValid = await store.dispatch('auth/checkLoginStatus')
      if (isValid) {
        // 服务器确认已登录，继续跳转
        next()
      } else {
        // 服务器确认未登录，跳转到登录页
        ElMessage.warning('请先登录')
        next('/login')
      }
    } catch (error) {
      // 检查失败，跳转到登录页
      ElMessage.warning('请先登录')
      next('/login')
    }
    return
  }
  
  // 已登录但访问登录/注册页
  if (to.meta.requiresGuest && isLoggedIn) {
    next('/home')
    return
  }
  
  next()
})

export default router