/* eslint-disable */
import { requestAdapter } from './a2s.adapter'
import type { ApiDocuments } from './a2s.namespace'
import { extract, replacePath } from './a2s.utils'

<% var keyList = [] %>
export const services = {
  <% Object.keys(it.paths || {}).forEach(path => { %>
    <% var pathGroup = it.paths[path] %>
    <% Object.keys(pathGroup || {}).forEach(method => { %>
      <% var api = pathGroup[method] %>
      <% var { queryList, paramList } = it.extractParameters(api.parameters) %>
      <% /* 计算api的key */ %>
      <% var group = api.tags ? api.tags[0] : 'default' %>
      <% var key = it.trimKey(group + '@' + (api.summary || path)) %>
      <% /* api的key有冲突 */ %>
      <% if (keyList.includes(key)) { %>
        <% it.addWarnMessages(`\x1B[33m检测到重复api key: [${key}]，后续接口替换为 group@method@path 格式。\x1B[0m`) %>
        <% key = it.trimKey(group + '@' + method.toLowerCase() + '@' + path) %>
      <% } else { %>
        <% keyList.push(key) %>
      <% } %>
      '<%= key %>'(<%~ include('openapi.args', { queryList: queryList, paramList: paramList, requestBody: api.requestBody }) %>) {
        return requestAdapter<<%~ include('openapi.resp', { responses: api.responses, fixKey: it.fixKey }) %>>({
          url: replacePath('<%= path %>', args),
          method: '<%= method.toUpperCase() %>',
          ...extract('<%= method.toUpperCase() %>', args, [<% queryList.forEach(q => {%>
          '<%=q.name%>',
          <% }) %>], [<% paramList.forEach(p => {%>
          '<%=p.name%>',
          <% }) %>])
        })
      },
    <% }) %>
  <% }) %>
}

export type ServiceKeys = keyof typeof services

export type ServiceArg<T extends ServiceKeys> = Parameters<typeof services[T]>[0]

export type Awaited<T> = T extends PromiseLike<infer U> ? Awaited<U> : T

export type ServiceReturn<T extends ServiceKeys> = Awaited<ReturnType<typeof services[T]>>['data']