import { getResult, postResult, putResult, withMiniTokenHeader } from './core/request'
import { getPersistedToken } from '@/store/auth'
import type { MiniAuthMeResponse, MiniLoginResponse, MiniProfileUpdateRequest } from '@/types/auth'

export function loginByWx(payload: { wxCode: string, phoneCode?: string }) {
  return postResult<MiniLoginResponse>('/api/mini/auth/login', payload)
}

export function fetchMiniMe(token?: string) {
  return getResult<MiniAuthMeResponse>('/api/mini/auth/me', withMiniTokenHeader(token))
}

export function updateMiniProfile(payload: MiniProfileUpdateRequest) {
  return putResult<MiniAuthMeResponse>('/api/mini/auth/profile', payload)
}

export function uploadMiniProfileImage(filePath: string) {
  const token = getPersistedToken()
  const uploadUrl = `${import.meta.env.VITE_API_BASE_URL}/api/mini/auth/upload/image`
  return new Promise<string>((resolve, reject) => {
    uni.uploadFile({
      url: uploadUrl,
      filePath,
      name: 'file',
      header: token
        ? {
            'Mini-Authorization': token,
          }
        : undefined,
      success: (res) => {
        try {
          const data = JSON.parse(res.data || '{}') as {
            success?: boolean
            message?: string
            result?: { url?: string }
          }
          if (data.success && data.result?.url) {
            resolve(data.result.url)
            return
          }
          reject(new Error(data.message || '头像上传失败'))
        }
        catch {
          reject(new Error('头像上传失败'))
        }
      },
      fail: () => reject(new Error('头像上传失败')),
    })
  })
}

export function logoutMini() {
  return postResult<void>('/api/mini/auth/logout')
}

export function unbindMiniOpenId() {
  return postResult<void>('/api/mini/auth/unbind-openid')
}
