import type { IAuthLoginRes, ICaptcha, IDoubleTokenRes, IUpdateInfo, IUpdatePassword, IUserInfoRes } from './types/login'
import { http } from '@/http/http'

/**
 * 登录表单
 */
export interface ILoginForm {
  username: string
  password: string
  code: string
  uuid: string
}

/**
 * 获取验证码
 * @returns ICaptcha 验证码
 */
export function getCaptcha() {
  return http.get<ICaptcha>('/captchaImage')
}

/**
 * 用户登录
 * @param loginForm 登录表单
 */
export function login(loginForm: ILoginForm) {
  return http.post<IAuthLoginRes>('/login', loginForm)
}

/**
 * 用户登录
 * @param loginForm 登录表单
 */
export function authExamLogin(loginForm: ILoginForm) {
  return http.post<IAuthLoginRes>('/exam/login', loginForm)
}

/**
 * 刷新token
 * @param refreshToken 刷新token
 */
export function refreshToken(refreshToken: string) {
  return http.post<IDoubleTokenRes>('/auth/refreshToken', { refreshToken })
}

/**
 * 获取用户信息
 */
export function getUserInfo() {
  return http.get<IUserInfoRes>('/getInfo')
}

/**
 * 退出登录
 */
export function logout() {
  return http.get<void>('/logout')
}

/**
 * 修改用户信息
 */
export function updateInfo(data: IUpdateInfo) {
  return http.post('/user/updateInfo', data)
}

/**
 * 修改用户密码
 */
export function updateUserPassword(data: IUpdatePassword) {
  return http.post('/user/updatePassword', data)
}

/**
 * 获取微信登录凭证
 * @returns Promise 包含微信登录凭证(code)
 */
export function getWxCode() {
  return new Promise<UniApp.LoginRes>((resolve, reject) => {
    uni.login({
      provider: 'weixin',
      success: res => resolve(res),
      fail: err => reject(new Error(err)),
    })
  })
}

/**
 * 微信登录
 * @param params 微信登录参数，包含code
 * @returns Promise 包含登录结果
 */
export function wxLogin(data: { code: string }) {
  return http.post<IAuthLoginRes>('/auth/wxLogin', data)
}

/**
 * 获取钉钉登录凭证
 * @returns Promise 包含钉钉登录凭证(code)
 */
export function getDingTalkCode() {
  return new Promise<{ code: string }>((resolve, reject) => {
    // #ifdef H5
    // H5环境下，模拟获取code，实际项目中可能需要通过URL参数或其他方式获取
    console.warn('H5环境下，需要手动传入钉钉code')
    resolve({ code: 'mock-dingtalk-code' })
    // #endif
    // #ifdef APP-PLUS
    // 钉钉小程序环境下，调用钉钉SDK获取code
    plus.dingtalk.getAuthCode({
      success: (res: { code: string }) => resolve(res),
      fail: (err: any) => reject(new Error(JSON.stringify(err))),
    })
    // #endif
  })
}

/**
 * 钉钉登录
 * @param authCode 钉钉授权码
 * @returns Promise 包含登录结果
 */
export function dingTalkLogin(authCode: string) {
  return http.get<IAuthLoginRes>(`/dingTalkLogin/${authCode}`)
}
