import json5 from 'json5'

/**
 * 根据当前环境创建服务配置
 *
 * @param env 当前环境
 */
export function createServiceConfig(env: Env.ImportMeta) {
  const { VITE_SERVICE_BASE_URL, VITE_OTHER_SERVICE_BASE_URL } = env

  let other = {} as Record<App.Service.OtherBaseURLKey, string>
  try {
    other = json5.parse(VITE_OTHER_SERVICE_BASE_URL)
  }
  catch {
    console.error('VITE_OTHER_SERVICE_BASE_URL 不是有效的 json5 字符串')
  }

  const httpConfig: App.Service.SimpleServiceConfig = {
    baseURL: VITE_SERVICE_BASE_URL, // 服务基础URL
    other,
  }

  const otherHttpKeys = Object.keys(httpConfig.other) as App.Service.OtherBaseURLKey[]

  const otherConfig: App.Service.OtherServiceConfigItem[] = otherHttpKeys.map((key) => {
    return {
      key,
      baseURL: httpConfig.other[key],
      proxyPattern: createProxyPattern(key), // 其他服务基础URL的代理模式
    }
  })

  const config: App.Service.ServiceConfig = {
    baseURL: httpConfig.baseURL, // 服务基础URL
    proxyPattern: createProxyPattern(), // 服务基础URL的代理模式
    other: otherConfig,
  }
  return config
}

/**
 * 获取后端服务基础地址
 *
 * @param env - 当前环境
 * @param isProxy - 是否使用代理
 */
export function getServiceBaseURL(env: Env.ImportMeta, isProxy: boolean) {
  const { baseURL, other } = createServiceConfig(env)

  const otherBaseURL = {} as Record<App.Service.OtherBaseURLKey, string>

  other.forEach((item) => {
    otherBaseURL[item.key] = isProxy ? item.proxyPattern : item.baseURL
  })

  return {
    baseURL: isProxy ? createProxyPattern() : baseURL,
    otherBaseURL,
  }
}

/**
 * 获取后端服务基础地址的代理模式
 *
 * @param key 如果未设置，将使用默认键
 */
function createProxyPattern(key?: App.Service.OtherBaseURLKey) {
  if (!key) {
    return '/proxy-default'
  }

  return `/proxy-${key}`
}
