import { MaybeRef, Ref } from 'vue'
import { ModuleItem, Icon } from '@ithinkdt/core'

export interface DtModuleItem extends ModuleItem {
    labelEn?: string
    parent?: DtModuleItem | undefined
    children?: DtModuleItem[]
}

export interface DtModuleData extends PartialKeys<Omit<DtModuleItem, 'icon' | 'children'>, 'key' | 'appCode'> {
    icon?: DtModuleItem['icon'] | PartialKeys<Icon, 'id' | 'type'>
    children?: DtModuleData[]
}

export declare function useModuleTree(options?: {
    appCode?: MaybeRef<string | undefined>
    immediate?: boolean
    includeApp?: boolean
    includeEmptyApp?: boolean
    includeAction?: boolean
}): {
    tree: Ref<DtModuleItem[]>
    loading: Ref<boolean>
    getByKey: (key: string) => DtModuleItem | undefined
    getParentByKey: (key: string) => DtModuleItem | undefined
    refresh: () => Promise<DtModuleItem[]>
    save<M extends MaybeArray<RequiredKeys<DtModuleData, 'appCode'>>>(
        this: void,
        m: M,
    ): Promise<M extends unknown[] ? DtModuleItem[] : DtModuleItem>
    del: (m: Pick<DtModuleItem, 'key'> | DtModuleItem['key']) => Promise<void>
}
