import { post, get } from '@/request/http'
import request from '@/request/http'
import type { Ref } from 'vue'


export interface LoginRequest {
  /**
   * 用户名
   */
  username?: string
  /**
   * 密码
   */
  password?: string
  /**
   * 授权类型  CAPTCHA  MOBILE
   */
  grantType?: string
  /**
   * 手机号
   */
  mobile?: string
  /**
   * 验证码
   */
  code?: string
}

/**
 * 用户登录函数
 *
 * 该函数用于处理用户登录请求，通过发送POST请求到指定的登录接口，并返回登录结果。
 *
 * @param {LoginRequest} request - 登录请求参数，包含用户登录所需的信息，如用户名、密码等。
 * @param {Ref<boolean>} [loading] - 可选的加载状态引用，用于在请求过程中控制加载状态的显示。
 *
 * @returns {Promise<string>} - 返回一个Promise，解析为登录结果。Result<string>包含登录成功后的令牌或错误信息。
 */
const login: (
    request: LoginRequest,
    loading?: Ref<boolean>
  ) => Promise<any> = (request, loading) => {
    return post('/oauth/anyTenant/login', { ...request  }, undefined, loading)
}


/**
 * 执行用户登出操作。
 * 该函数通过发送POST请求到指定的登出接口，以结束当前用户的会话。
 *
 * @returns {Promise<any>} 返回一个Promise对象，该对象解析为登出操作的结果。
 *                                 Result<any>表示登出操作返回的结果，具体类型取决于后端接口的返回结构。
 */
const logout: () => Promise<any> = () => {
  return post('/oauth/anyUser/logout',)
}


/**
 * 获取用户信息
 *
 * 该函数通过调用 `/oauth/anyone/getUserInfoById` 接口获取当前用户的信息。
 *
 * @param {Ref<boolean>} [loading] - 可选参数，用于控制加载状态的引用。如果提供，函数会在请求开始时将 `loading` 设置为 `true`，请求结束后设置为 `false`。
 * @returns {Promise<any>} - 返回一个 Promise，解析为包含用户信息的结果对象。结果对象的类型为 `Result<any>`，其中 `any` 表示用户信息的具体数据结构。
 */
const getUserInfo: (
  loading?: Ref<boolean>
) => Promise<any> = ( loading) => {
  return get('/oauth/anyone/getUserInfoById', undefined, loading)
}


/**
 * 获取租户信息
 *
 * 该函数通过调用 `/oauth/anyone/findCompanyDept` 接口获取当前租户的信息。
 *
 * @returns {Promise<any>} - 返回一个 Promise，解析为包含用户信息的结果对象。结果对象的类型为 `Result<any>`，其中 `any` 表示用户信息的具体数据结构。
 * @param tenantId
 */
const findCompanyDept: (
  tenantId?: string
) => Promise<any> = ( tenantId) => {
  return get('/oauth/anyone/findCompanyDept', { tenantId })
}


type uploadData = {
  /** 业务类型 */
  bizType: string
  /** 桶 */
  bucket?: string
  /** 存储类型 */
  storageType?: string
  /** 附件 */
  file: any
}
type FileResultVO = {
  /** 业务类型 */
  bizType?: string
  /** 文件类型-枚举 */
  fileType?: 'IMAGE' | 'VIDEO' | 'AUDIO' | 'DOC' | 'OTHER'
  /** 文件存储类型 */
  storageType?: 'LOCAL' | 'FAST_DFS' | 'MIN_IO' | 'ALI_OSS' | 'QINIU_OSS' | 'HUAWEI_OSS'
  /** 桶 */
  bucket?: string
  /** 文件相对地址 */
  path?: string
  /** 文件访问地址 */
  url?: string
  /** 唯一文件名 */
  uniqueFileName?: string
  /** 文件md5 */
  fileMd5?: string
  /** 原始文件名 */
  originalFileName?: string
  /** 文件类型 */
  contentType?: string
  /** 后缀 */
  suffix?: string
  /** 大小 */
  size?: number
  /** 主键 */
  id?: number
  tenantId?: number
}

type RFileResultVO = {
  /** 响应编码:0/200-请求处理成功 */
  code?: number
  data?: FileResultVO
  /** 提示消息 */
  msg?: string
  /** 请求路径 */
  path?: string
  /** 附加数据 */
  extra?: Record<string, any>
  /** 响应时间戳 */
  timestamp?: number
  /** 异常消息 */
  errorMsg?: string
  isSuccess?: boolean
}


/** 上传文件 上传文件 POST /anyone/file/upload */
export async function upload(
  data: uploadData,
  options?: { [key: string]: any }
) {
  return request<RFileResultVO>(`/base/anyone/file/upload`, {
    method: 'POST',
    data,
    ...(options || {})
  })
}


export default {
    login,
    logout,
    getUserInfo,
    findCompanyDept,
}
