/**
 * 支付模块接口
 * 包含: 创建支付宝订单、查询支付结果、订单详情
 */
import request from '../utils/request'
import type { OrderStatus } from './types'

/** 创建订单参数 */
export interface CreateOrderParams {
  /** 会员ID(可选,新注册用户可能没有) */
  memberId?: string
  /** 会员类型描述 */
  memberType: string
  /** 订单金额 */
  amount: number
  /** 有效期描述 */
  validPeriod: string
  /** 是否续费 */
  isRenew?: boolean
}

/** 创建订单返回 */
export interface CreateOrderResult {
  /** 订单号 */
  orderId: string
  /** 订单金额 */
  amount: number
  /** 支付宝支付链接(用于在浏览器中打开) */
  payUrl: string
  /** 订单创建时间 */
  createTime: string
  /** 订单过期时间(超时未支付自动取消) */
  expireTime: string
}

/** 订单详情 */
export interface OrderDetail {
  orderId: string
  memberId: string
  memberType: string
  amount: number
  validPeriod: string
  status: OrderStatus
  payUrl?: string
  isRenew: boolean
  createTime: string
  payTime?: string
  expireTime: string
}

/** 支付结果查询响应 */
export interface PayResult {
  /** 订单状态 */
  status: OrderStatus
  /** 是否支付成功 */
  paid: boolean
  /** 支付完成时间 */
  payTime?: string
  /** 支付宝交易号 */
  tradeNo?: string
}

/** 创建支付宝订单(返回支付链接) */
export const createAlipayOrder = (data: CreateOrderParams) =>
  request.post<CreateOrderResult>('/payment/alipay/create', data)

/** 创建支付宝充值 H5 订单参数 */
export interface RechargeCreateDTO {
  /** 充值金额,示例值(99) */
  amount: number
  /** 订单标题,示例值(会员充值) */
  subject?: string
}

/**
 * 创建支付宝充值 H5 订单返回
 * 后端返回的形态可能是:
 *  - 字符串: 直接是支付宝表单 HTML 或跳转 URL
 *  - 对象: { payUrl?, body?, form?, orderId?, ... }
 * 这里用宽松类型,前端容错取支付链接
 */
export type RechargeAlipayH5OrderResult =
  | string
  | {
      payUrl?: string
      payURL?: string
      url?: string
      body?: string
      form?: string
      orderId?: string
      tradeNo?: string
      [key: string]: unknown
    }

/**
 * 创建支付宝充值 H5 订单
 * POST /api/v1/wechat/official-account/recharges/alipay/h5/orders
 */
export const createRechargeAlipayH5Order = (data: RechargeCreateDTO) =>
  request.post<RechargeAlipayH5OrderResult>(
    '/recharges/alipay/h5/orders',
    data,
  )

/** 查询订单支付结果(用于轮询) */
export const queryPayResult = (orderId: string) =>
  request.get<PayResult>(`/payment/result/${orderId}`)

/** 查询订单详情 */
export const getOrderDetail = (orderId: string) =>
  request.get<OrderDetail>(`/payment/order/${orderId}`)

/** 取消订单 */
export const cancelOrder = (orderId: string) =>
  request.post<void>(`/payment/order/${orderId}/cancel`)
