import { createRouter, createWebHistory } from 'vue-router'
import { ElMessage } from 'element-plus'
import { useUserStore } from '@/stores/user'
import { usePartnerStore } from '@/stores/partner'
import { getLandingPath } from '@/utils/landing'

const router = createRouter({
  history: createWebHistory(),
  routes: [
    {
      path: '/',
      redirect: '/login',
    },
    {
      path: '/login',
      name: 'Login',
      component: () => import('@/views/LoginView.vue'),
    },
    // 业务员查询融合入口（TASK-379 路径重构，2026-04-21）：
    // - URL 保持 /p/products?k=xxx（客户原链接不变，k 做身份追踪）
    // - 未登录显示登录表单，已登录显示产品查询（页面内条件渲染，不跳路由）
    // - 取代原 /partner/login 和 /partner/products 独立页
    {
      path: '/p/products',
      name: 'PartnerProducts',
      component: () => import('@/views/public/PublicProductsView.vue'),
      meta: { public: true, skipAuth: true, partner: true },
    },
    // 总业务员（彭春花）CRUD 入口
    {
      path: '/partner/admin/salesmen',
      name: 'PartnerAdminSalesmen',
      component: () => import('@/views/partner/admin/SalesmanManagement.vue'),
      meta: { partner: true, requiresPartnerAuth: true, requiresMaster: true },
    },
    {
      // TASK-456 客户列表加 RBAC `customers` 权限保护：
      // - 后端给所有现有角色 migration 回填 customers 权限，超管 + 老 admin 体验零变化
      // - 仅持 partner_products（邬毅）等无 customers 权限的账号会被守卫拦截
      // - 拦截后重定向到 getLandingPath() 智能落地页（不再死板回 /customers，避免死循环）
      path: '/customers',
      name: 'Customers',
      component: () => import('@/views/CustomersView.vue'),
      meta: { requiresAuth: true, requiredPermission: 'customers' },
    },
    {
      path: '/my-videos',
      name: 'MyVideos',
      component: () => import('@/views/MyVideosView.vue'),
      meta: { requiresAuth: true },
    },
    {
      path: '/customer/:id',
      name: 'CustomerBoard',
      component: () => import('@/views/BoardView.vue'),
      meta: { requiresAuth: true },
    },
    {
      path: '/product/:id',
      name: 'ProductDetail',
      component: () => import('@/views/ProductDetailView.vue'),
      meta: { requiresAuth: true },
    },
    {
      path: '/knowledge',
      name: 'Knowledge',
      component: () => import('@/views/KnowledgeView.vue'),
      meta: { requiresAuth: true, requiredPermission: 'knowledge' },
    },
    {
      path: '/admin/quick-pick',
      name: 'QuickPickAdmin',
      component: () => import('@/views/QuickPickAdminView.vue'),
      meta: { requiresAuth: true, requiredPermission: 'quick_pick' },
    },
    {
      path: '/dialects',
      name: 'Dialects',
      component: () => import('@/views/DialectsView.vue'),
      meta: { requiresAuth: true, requiredPermission: 'dialects' },
    },
    {
      path: '/dimensions',
      name: 'Dimensions',
      component: () => import('@/views/DimensionsView.vue'),
      meta: { requiresAuth: true, requiredPermission: 'dimensions' },
    },
    {
      path: '/admin/documents',
      name: 'Documents',
      component: () => import('@/views/DocumentsView.vue'),
      meta: { requiresAuth: true, requiredPermission: 'documents' },
    },
    {
      path: '/admin/rbac',
      name: 'RbacAdmin',
      component: () => import('@/views/RbacAdminView.vue'),
      meta: { requiresAuth: true, requiresSuperAdmin: true },
    },
    {
      path: '/admin/policy-v2/projects',
      name: 'PolicyV2ProjectList',
      component: () => import('@/views/admin/PolicyV2ProjectListView.vue'),
      meta: { requiresAuth: true, requiredPermission: 'quick_pick' },
    },
    {
      path: '/admin/policy-v2/upload',
      name: 'PolicyV2Upload',
      component: () => import('@/views/admin/PolicyV2UploadView.vue'),
      meta: { requiresAuth: true, requiredPermission: 'quick_pick' },
    },
    {
      path: '/admin/policy-v2/tasks/:id',
      name: 'PolicyV2TaskProgress',
      component: () => import('@/views/admin/PolicyV2TaskProgressView.vue'),
      meta: { requiresAuth: true, requiredPermission: 'quick_pick' },
    },
    {
      path: '/admin/policy-v2/projects/:id/review',
      name: 'PolicyV2Review',
      component: () => import('@/views/admin/PolicyV2ReviewView.vue'),
      meta: { requiresAuth: true, requiredPermission: 'quick_pick' },
    },
    {
      path: '/admin/policy-v2/projects/:id',
      name: 'PolicyV2ProjectDetail',
      component: () => import('@/views/admin/PolicyV2ProjectDetailView.vue'),
      meta: { requiresAuth: true, requiredPermission: 'quick_pick' },
    },
    {
      path: '/admin/sales-activity',
      name: 'SalesActivity',
      component: () => import('@/views/admin/SalesActivityView.vue'),
      meta: { requiresAuth: true, requiredPermission: 'sales_activity' },
    },
    {
      // TASK-448 同步可视化监控页（admin 专属，5 模块 30s 轮询）
      path: '/admin/sync-monitor',
      name: 'SyncMonitor',
      component: () => import('@/views/admin/SyncMonitorView.vue'),
      meta: { requiresAuth: true, requiresSuperAdmin: true },
    },
    {
      // TASK-454 业务员视角产品页（admin RBAC 镜像，7 套价格全开）
      // 持有 RBAC `partner_products` 权限的 admin 可见，super_admin 自动放行
      // beforeEach 守卫已支持 requiredPermission 字段，无需额外改造
      path: '/admin/partner-preview',
      name: 'AdminPartnerPreview',
      component: () => import('@/views/admin/PartnerPreviewView.vue'),
      meta: { requiresAuth: true, requiredPermission: 'partner_products' },
    },
    {
      path: '/admin/performance',
      name: 'Performance',
      component: () => import('@/views/PerformanceView.vue'),
      meta: { requiresAuth: true, requiresSuperAdmin: true },
    },
    {
      path: '/admin/salesmen',
      name: 'SalesmanList',
      // TASK-378 业务员管理后台（mock 先行）。
      // 当前权限：requiresSuperAdmin=true，等 TASK-378 后端给彭春花 is_master 接入后，
      // 改成自定义权限守卫（is_super_admin OR is_master）。
      component: () => import('@/views/admin/SalesmanListView.vue'),
      meta: { requiresAuth: true, requiresSuperAdmin: true },
    },
  ],
})

router.beforeEach((to) => {
  // 业务员路由守卫（TASK-379 路径重构后：登录页 = /p/products 融合入口）
  if (to.meta.requiresPartnerAuth) {
    const partnerStore = usePartnerStore()
    if (!partnerStore.isLoggedIn) {
      // 未登录 → 跳 /p/products 融合页（未登录态显示登录表单）
      return { name: 'PartnerProducts' }
    }
    // B 方案：总业务员专属路由（管业务员 CRUD）
    if (to.meta.requiresMaster && !partnerStore.isMaster) {
      ElMessage.error('只有总业务员可访问')
      return { name: 'PartnerProducts' }
    }
    return
  }
  if (to.meta.requiresAuth) {
    const userStore = useUserStore()
    if (!userStore.isLoggedIn) {
      return { name: 'Login', query: { redirect: to.fullPath } }
    }
    // TASK-456：被拦截时跳到「智能落地页」(getLandingPath) 而非死板 /customers，
    // 避免邬毅这类无 customers 权限的账号访问 /customers → 重定向 /customers → 死循环
    if (to.meta.requiresSuperAdmin && !userStore.isSuperAdmin) {
      const landing = getLandingPath(userStore)
      // 防死循环：智能落地页 = 当前路径 → 跳登录页让用户重新换号
      return landing === to.path ? { name: 'Login' } : landing
    }
    if (to.meta.requiredPermission && !userStore.hasPermission(to.meta.requiredPermission as string)) {
      const landing = getLandingPath(userStore)
      return landing === to.path ? { name: 'Login' } : landing
    }
  }
})

export default router
