/* eslint-disable */
import axios, { AxiosInstance, AxiosResponse } from 'axios'
import qs from 'qs'

export interface ObjectType {
  [key: string]: any;
}

export interface Config {
  $domain?: string;
  $config?: any;
}

export interface Parameters {
  [key: string]: any;
}

let domain = ''
let axiosInstance = axios.create()
export function getDomain(): string {
  return domain
}
export function setDomain($domain: string): void {
  domain = $domain
}
export function getAxiosInstance(): AxiosInstance {
  return axiosInstance
}
export function setAxiosInstance($axiosInstance: AxiosInstance): void {
  axiosInstance = $axiosInstance
}
type RequestMethod = 'get' | 'post' | 'put' | 'delete' | 'head' | 'option' | 'patch'
export function request(method: RequestMethod, url: string, body?: ObjectType, config: ObjectType = {}) {
  let queryUrl = url
  if (method === 'delete') {
    return axiosInstance[method](queryUrl,{...config, data: body || {} })
  } else if (method === 'get') {
    let params = body ? qs.stringify(body) : ''
    if (params) {
      if (queryUrl.indexOf('?') < 0) {
        params = '?' + params
      } else if (!queryUrl.endsWith('?')) {
        params = '&' + params
      }
    }
    return axiosInstance[method](queryUrl + params, config)
  } else if(method === 'post' || method === 'put' || method === 'patch'){
    return axiosInstance[method](queryUrl, body, config)
  } else if (method === 'head' || method === 'option') {
    return axiosInstance[method](queryUrl, config)
  }
}

// ExecutorRequest
export interface ExecutorRequest {
  executeType: string; // 执行器类型,可选:mysql(mysql执行器),ch(clickhouse执行器),hql(hive执行器),sqoop(sqoop执行器),ssql(spark sql执行器),so(park object执行器),flink(flink执行器)
  jobName: string; // 作业名称
  param: string; // 执行参数(k=v,多个时用逗号分隔),必须包含d=xx(日期)
  projectCode: string; // 项目编号
}

// InitSysRequest
export interface InitSysRequest {
  jobName: string; // 作业名称
  param: string; // 执行参数(k=v,多个时用逗号分隔),必须包含d=xx(日期)
  projectCode: string; // 项目编号
}

// InterfaceRequest
export interface InterfaceRequest {
  executeType: string; // 执行器类型,可选:interface(接口查询执行器)
  jobName: string; // 作业名称
  param: string; // 执行参数(k=v,多个时用逗号分隔),必须包含d=xx(日期)
  projectCode: string; // 项目编号
}

// 公共响应对象
export interface 公共响应对象 {
  data?: ObjectType; // 业务数据
  errorCode?: string; // 错误码
  errorMsg?: string; // 错误信息
  status?: boolean; // 响应状态
}


export interface InterfaceServiceexecuteParameters {
  request: ExecutorRequest; // request
}

/**
 * @name: InterfaceServiceexecute
 * @date: 2022/1/21
 * @description: 脚本执行器
 * @param: {request} [ExecutorRequest]
 * @return: Promise<AxiosResponse<公共响应对象>>
 */
export function InterfaceServiceexecute(parameters: Config & InterfaceServiceexecuteParameters): Promise<AxiosResponse<公共响应对象>> {
  const { $config, $domain, ...body} = parameters
  const host = $domain ? $domain : getDomain()
  let path = '/admin/api/v1/BDCommon/service/executor'

  return request('post', host + path, body, $config)
}

export interface InterfaceServiceinitSysJobParameters {
  request: InitSysRequest; // request
}

/**
 * @name: InterfaceServiceinitSysJob
 * @date: 2022/1/21
 * @description: 初始化系统job数据,创建系统表
 * @param: {request} [InitSysRequest]
 * @return: Promise<AxiosResponse<公共响应对象>>
 */
export function InterfaceServiceinitSysJob(parameters: Config & InterfaceServiceinitSysJobParameters): Promise<AxiosResponse<公共响应对象>> {
  const { $config, $domain, ...body} = parameters
  const host = $domain ? $domain : getDomain()
  let path = '/admin/api/v1/BDCommon/service/initSysJob'

  return request('post', host + path, body, $config)
}

export interface InterfaceServicequeryParameters {
  request: InterfaceRequest; // request
}

/**
 * @name: InterfaceServicequery
 * @date: 2022/1/21
 * @description: 接口查询
 * @param: {request} [InterfaceRequest]
 * @return: Promise<AxiosResponse<公共响应对象>>
 */
export function InterfaceServicequery(parameters: Config & InterfaceServicequeryParameters): Promise<AxiosResponse<公共响应对象>> {
  const { $config, $domain, ...body} = parameters
  const host = $domain ? $domain : getDomain()
  let path = '/admin/api/v1/BDCommon/service/interface'

  return request('post', host + path, body, $config)
}

export interface ExecutorServiceexecuteParameters {
  request: ExecutorRequest; // request
}

/**
 * @name: ExecutorServiceexecute
 * @date: 2022/1/21
 * @description: 脚本执行器
 * @param: {request} [ExecutorRequest]
 * @return: Promise<AxiosResponse<公共响应对象>>
 */
export function ExecutorServiceexecute(parameters: Config & ExecutorServiceexecuteParameters): Promise<AxiosResponse<公共响应对象>> {
  const { $config, $domain, ...body} = parameters
  const host = $domain ? $domain : getDomain()
  let path = '/internal/api/v1/BDCommon/service/executor'

  return request('post', host + path, body, $config)
}

export interface ExecutorServiceinitSysJobParameters {
  request: InitSysRequest; // request
}

/**
 * @name: ExecutorServiceinitSysJob
 * @date: 2022/1/21
 * @description: 初始化系统job数据,创建系统表
 * @param: {request} [InitSysRequest]
 * @return: Promise<AxiosResponse<公共响应对象>>
 */
export function ExecutorServiceinitSysJob(parameters: Config & ExecutorServiceinitSysJobParameters): Promise<AxiosResponse<公共响应对象>> {
  const { $config, $domain, ...body} = parameters
  const host = $domain ? $domain : getDomain()
  let path = '/internal/api/v1/BDCommon/service/initSysJob'

  return request('post', host + path, body, $config)
}

export interface ExecutorServicequeryParameters {
  request: InterfaceRequest; // request
}

/**
 * @name: ExecutorServicequery
 * @date: 2022/1/21
 * @description: 接口查询
 * @param: {request} [InterfaceRequest]
 * @return: Promise<AxiosResponse<公共响应对象>>
 */
export function ExecutorServicequery(parameters: Config & ExecutorServicequeryParameters): Promise<AxiosResponse<公共响应对象>> {
  const { $config, $domain, ...body} = parameters
  const host = $domain ? $domain : getDomain()
  let path = '/internal/api/v1/BDCommon/service/interface'

  return request('post', host + path, body, $config)
}