import { shallowReactive } from 'vue'

export interface IDataSourceResult {
  code: string
  msg: string
  data: any
}

export interface IDataSource {
  load?: () => Promise<IDataSourceResult>
  config?: {
    type: string
    data: any
    total?: number
  }
}

export interface IDataSourceMap {
  value?: Record<string, IDataSource>
}

export function useDataSourceMap() {
  const dataSourceMap = shallowReactive<IDataSourceMap>({})

  const getDataSourceMap = () => {
    return dataSourceMap.value
  }

  const setDataSourceMap = (list) => {
    dataSourceMap.value = list.reduce((dMap, config) => {
      const dataSource: IDataSource = { config: config.data }

      const result = {
        code: '',
        msg: 'success',
        data: {}
      }
      result.data = { items: dataSource?.config?.data ?? [], total: dataSource?.config?.data?.length }

      dataSource.load = () => Promise.resolve(result)
      dMap[config.name] = dataSource

      return dMap
    }, {})
  }
  return {
    dataSourceMap,
    getDataSourceMap,
    setDataSourceMap
  }
}