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/:infoHash',
    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