import type { RouteMeta, RouteRecordRaw } from 'vue-router'
import type { RoleEnum } from '/@/enums/roleEnum'
import type { defineComponent } from 'vue'

export type Component<T = any> =
    | ReturnType<typeof defineComponent>
    | (() => Promise<typeof import('*.vue')>)
    | (() => Promise<T>)

// @ts-expect-error
export interface AppRouteRecordRaw extends Omit<RouteRecordRaw, 'meta'> {
    uid?: string
    name: string
    meta: RouteMeta
    component?: Component | string
    components?: Component
    children?: AppRouteRecordRaw[]
    props?: Recordable
    fullPath?: string
}

export interface MenuTag {
    type?: 'primary' | 'error' | 'warn' | 'success'
    content?: string
    dot?: boolean
}

export interface Menu {
    name: string

    icon?: string

    path: string

    // path contains param, auto assignment.
    paramPath?: string

    disabled?: boolean

    children?: Menu[]

    orderNo?: number

    roles?: RoleEnum[]

    meta?: Partial<RouteMeta>

    tag?: MenuTag

    hideMenu?: boolean
}

export interface MenuModule {
    orderNo?: number
    menu: Menu
}

// export type AppRouteModule = RouteModule | AppRouteRecordRaw;
export type AppRouteModule = AppRouteRecordRaw
