// 基于约定路径自动解析 pagetype 详情覆盖组件
// 约定：/src/views/pagetype/<pagetype>/<pagetype>.vue

type AsyncComponentLoader = () => Promise<any>

// 扫描所有可能的覆盖组件（仅限 .vue）
// 使用 eager: false 延迟加载，生产环境下可按需分包
const allPagetypeViews: Record<string, AsyncComponentLoader> = import.meta.glob(
  '/src/views/pagetype/**/**.vue'
)

function getPathSegments(path: string): string[] {
  // 统一分隔符
  return path.split('/').filter(Boolean)
}

/**
 * 解析并返回指定 pagetype 的详情覆盖组件
 * @param pagetypeSlug 路由中的原始 pagetype（保持小写与下划线）
 */
export async function resolvePagetypeDetailOverride(pagetypeSlug: string): Promise<any | null> {
  if (!pagetypeSlug) return null
  // URL 使用短横线，文件夹使用下划线，与后端保持一致
  const targetHyphen = pagetypeSlug.toLowerCase()
  const targetUnderscore = targetHyphen.replace(/-/g, '_')

  // 匹配形如 views/pagetype/<name>/<name>.vue 的文件
  const candidates = Object.keys(allPagetypeViews).filter((file) => {
    const segs = getPathSegments(file)
    const len = segs.length
    if (len < 5) return false
    // 路径应为 views/pagetype/<name>/<name>.vue
    const fileName = segs[len - 1]
    const folderName = segs[len - 2]
    const baseName = fileName.replace(/\.vue$/i, '')
    // 需要同时满足：位于 views/pagetype 下，且末两级目录名与目标一致（支持下划线形式）
    return (
      segs[1] === 'views' && 
      segs[2] === 'pagetype' && 
      folderName === targetUnderscore && 
      baseName === targetUnderscore
    )
  })

  if (candidates.length === 0) return null

  // 若有多个命中，按路径长度最短优先（更接近根的优先），其次按字母序
  candidates.sort((a, b) => {
    if (a.length !== b.length) return a.length - b.length
    return a.localeCompare(b)
  })

  const pick = candidates[0]
  try {
    const mod = await allPagetypeViews[pick]()
    return mod?.default ?? mod
  } catch (_e) {
    return null
  }
}


/**
 * 解析并返回指定 pagetype 的工具栏覆盖组件
 * 约定文件名：/src/views/pagetype/<name>/<name>_toolbar.vue
 */
export async function resolvePagetypeToolbarOverride(pagetypeSlug: string): Promise<any | null> {
  if (!pagetypeSlug) return null
  const targetHyphen = pagetypeSlug.toLowerCase()
  const targetUnderscore = targetHyphen.replace(/-/g, '_')

  const candidates = Object.keys(allPagetypeViews).filter((file) => {
    const segs = getPathSegments(file)
    const len = segs.length
    if (len < 5) return false
    // 路径应为 views/pagetype/<name>/<name>_toolbar.vue
    const fileName = segs[len - 1]
    const folderName = segs[len - 2]
    const baseName = fileName.replace(/\.vue$/i, '')
    return (
      segs[1] === 'views' && 
      segs[2] === 'pagetype' && 
      folderName === targetUnderscore && 
      baseName === `${targetUnderscore}_toolbar`
    )
  })

  if (candidates.length === 0) return null

  candidates.sort((a, b) => {
    if (a.length !== b.length) return a.length - b.length
    return a.localeCompare(b)
  })

  const pick = candidates[0]
  try {
    const mod = await allPagetypeViews[pick]()
    return mod?.default ?? mod
  } catch (_e) {
    return null
  }
}


