/**
 * 动态路由生成模块（Platform 特定）
 * 
 * 职责：
 * 1. 提供 Platform 特定的布局和组件配置
 * 2. 调用 shared 中的通用路由生成方法
 * 3. 将生成的路由添加到 Platform 的 router 实例
 */

/// <reference types="vite/client" />

import { 
    generateSimpleRoutes, 
    loadViewsFromStorage,
    type RouteGeneratorConfig,
    type GenerateSimpleRoutesOptions
} from 'shared/utils/route'
import type { TbSysViewDTO } from 'shared/types'
import type { RouteRecordRaw } from 'vue-router'
import router from './index'
import { SidebarLayout, BlankLayout, AdminSidebarLayout, SubSidebarLayout } from '@/layouts'

// Platform 布局组件映射
const platformLayoutMap: Record<string, () => Promise<any>> = {
    'SidebarLayout': () => Promise.resolve({ default: SidebarLayout }),
    'BlankLayout': () => Promise.resolve({ default: BlankLayout }),
    'NavigationLayout': () => Promise.resolve({ default: SidebarLayout }),
    'BasicLayout': () => Promise.resolve({ default: SidebarLayout }),
    'AdminSidebarLayout': () => Promise.resolve({ default: AdminSidebarLayout }),
    'SubSidebarLayout': () => Promise.resolve({ default: SubSidebarLayout })
}

// 视图组件加载器
const VIEW_MODULES = import.meta.glob<{ default: any }>('@/views/**/*.vue')

/**
 * 视图组件加载函数
 * @param componentPath 组件路径（如 "public/Chat/AIChatView.vue"）
 */
function viewLoader(componentPath: string): (() => Promise<any>) | null {
    // 将后台路径转换为 @/views 格式
    let path = componentPath
    
    // 移除开头的斜杠（如果有）
    if (path.startsWith('/')) {
        path = path.substring(1)
    }
    
    // 补全 .vue 后缀（如果没有）
    if (!path.endsWith('.vue')) {
        path += '.vue'
    }
    
    // 转换为 /src/views 格式（匹配 import.meta.glob 的 key）
    const fullPath = `/src/views/${path}`
    
    console.log('[Platform viewLoader] 尝试加载组件:', componentPath, '→', fullPath)
    
    const loader = VIEW_MODULES[fullPath]
    
    if (!loader) {
        console.warn('[Platform viewLoader] 组件未找到:', fullPath)
        console.log('[Platform viewLoader] 可用的组件:', Object.keys(VIEW_MODULES))
        return null
    }
    
    return loader as () => Promise<any>
}

// Platform 路由生成器配置
const routeConfig: RouteGeneratorConfig = {
    layoutMap: platformLayoutMap,
    viewLoader,
    notFoundComponent: () => Promise.resolve({
        default: {
            template: '<div style="padding: 20px; text-align: center;"><h2>404 - 页面未找到</h2></div>'
        }
    })
}

// Platform 路由生成选项
const routeOptions: GenerateSimpleRoutesOptions = {
    asRootChildren: false,  // 直接作为根级路由，不是某个布局的子路由
    iframePlaceholder: () => import('shared/components').then(m => ({ default: m.IframeView })),
    verbose: true  // 启用详细日志
}

/**
 * 添加动态路由（Platform 特定）
 * @param views 视图列表（用作菜单）
 */
export function addDynamicRoutes(views: TbSysViewDTO[]) {
    if (!views || views.length === 0) {
        console.warn('[Platform] addDynamicRoutes: 视图列表为空')
        return
    }
    
    console.log('[Platform] addDynamicRoutes: 开始添加动态路由，视图数量:', views.length)
    
    try {
        // 使用 shared 中的通用方法生成路由
        const routes = generateSimpleRoutes(views, routeConfig, routeOptions)
        
        // 直接将路由添加到根级别（不是作为Root的children）
        routes.forEach(route => {
            console.log('[Platform] addDynamicRoutes: 添加路由', route.path, '使用布局:', route.component?.name || 'unknown')
            router.addRoute(route)
        })
        
        // 动态添加根路径重定向到第一个菜单项
        if (routes.length > 0) {
            const firstRoute = routes[0]
            router.addRoute({
                path: '/',
                redirect: firstRoute.path
            })
            console.log('[Platform] addDynamicRoutes: 添加根路径重定向到', firstRoute.path)
        }
        
    } catch (error) {
        console.error('[Platform] addDynamicRoutes: 添加路由失败', error)
        throw error
    }
}

// ============================================
// 以下为 Platform 特有的辅助函数
// 通用的路由生成逻辑已迁移到 shared/utils/route
// ============================================

/**
 * 从 LocalStorage 获取菜单并生成路由（Platform 特定）
 * 
 * 使用 shared 中的通用 loadViewsFromStorage 方法
 */
export function loadRoutesFromStorage(): boolean {
    try {
        console.log('[Platform] loadRoutesFromStorage: 开始加载动态路由')
        
        // 使用 shared 中的通用方法加载视图数据
        const allViews = loadViewsFromStorage('loginDomain', 'userViews')
        
        console.log('[Platform] loadRoutesFromStorage: 加载的所有视图数量:', allViews?.length || 0)
        
        if (allViews) {
            // 过滤出 platform 服务的视图
            const platformViews = allViews.filter((view: TbSysViewDTO) => 
                view.service === 'platform'
            )
            
            console.log('[Platform] loadRoutesFromStorage: 过滤后的 platform 视图:', platformViews)
            
            if (platformViews.length === 0) {
                console.warn('[Platform] loadRoutesFromStorage: 没有找到 platform 服务的视图')
                return false
            }
            
            // 使用 Platform 的 addDynamicRoutes 添加路由
            addDynamicRoutes(platformViews)
            return true
        }
        
        console.warn('[Platform] loadRoutesFromStorage: 未能加载视图数据')
        return false
    } catch (error) {
        console.error('[Platform] loadRoutesFromStorage: 加载路由失败', error)
        return false
    }
}
