import request from '@/utils/http'

/**
 * 账单接口基础路径
 *
 * 说明：后端路由为 /api/admin/v1/billings。
 */
const BILLING_BASE_URL = '/api/admin/v1/billings'

// ==================== 查询类 API ====================

/**
 * 获取账单列表
 * @param params 查询参数
 */
export function fetchBillingList(params?: Partial<Api.Billing.BillingListParams>) {
  return request.get<Api.Billing.BillingListResponse>({
    url: BILLING_BASE_URL,
    params
  })
}

/**
 * 获取账单列表（导出用：自动分页拉取）
 * @param params 查询参数（不含分页也可）
 * @param options 导出拉取选项
 */
export async function fetchBillingListForExport(
  params?: Partial<Api.Billing.BillingListParams>,
  options?: {
    /** 单页拉取条数（越大越快，但后端可能有限制） */
    pageSize?: number
    /** 最大导出条数（防止一次性导出过大） */
    maxRows?: number
  }
) {
  // 1. 兜底配置
  const pageSize = Math.min(Math.max(options?.pageSize ?? 200, 50), 2000)
  const maxRows = Math.min(Math.max(options?.maxRows ?? 10000, 1), 100000)

  // 2. 循环分页拉取（直到 totalPages 或达到 maxRows）
  const result: Api.Billing.BillingListDto[] = []
  let pageNumber = 1
  let totalPages = 1

  while (pageNumber <= totalPages && result.length < maxRows) {
    const res = await fetchBillingList({
      ...params,
      PageNumber: pageNumber,
      PageSize: pageSize
    })

    const items = res.items || []
    result.push(...items)

    totalPages = res.totalPages || 1
    if (items.length === 0) break
    pageNumber += 1
  }

  // 3. 截断到 maxRows，避免极端情况内存爆炸
  return result.slice(0, maxRows)
}

/**
 * 获取账单详情
 * @param id 账单 ID
 */
export function fetchBillingDetail(id: string) {
  return request.get<Api.Billing.BillingDetailDto>({
    url: `${BILLING_BASE_URL}/${id}`
  })
}

/**
 * 获取账单支付记录
 * @param billingId 账单 ID
 */
export function fetchBillingPayments(billingId: string) {
  return request.get<Api.Billing.PaymentRecordListResponse>({
    url: `${BILLING_BASE_URL}/${billingId}/payments`
  })
}

/**
 * 获取账单统计数据
 * @param params 统计查询参数
 */
export function fetchBillingStatistics(params: Api.Billing.BillingStatisticsParams) {
  return request.get<Api.Billing.BillingStatisticsDto>({
    url: `${BILLING_BASE_URL}/statistics`,
    params
  })
}

/**
 * 获取逾期账单列表
 * @param params 分页参数
 */
export function fetchOverdueBillings(params?: Partial<Api.Billing.BillingListParams>) {
  return request.get<Api.Billing.BillingListResponse>({
    url: `${BILLING_BASE_URL}/overdue`,
    params
  })
}

// ==================== 命令类 API ====================

/**
 * 创建账单
 * @param data 创建账单数据
 */
export function createBilling(data: Api.Billing.CreateBillingCommand) {
  return request.post<Api.Billing.BillingDetailDto>({
    url: BILLING_BASE_URL,
    data
  })
}

/**
 * 更新账单状态
 * @param id 账单 ID
 * @param data 更新状态数据
 */
export function updateBillingStatus(id: string, data: Api.Billing.UpdateStatusCommand) {
  return request.put<Api.Billing.BillingDetailDto>({
    url: `${BILLING_BASE_URL}/${id}/status`,
    data
  })
}

/**
 * 取消账单
 * @param id 账单 ID
 * @param data 取消原因
 */
export function cancelBilling(id: string, data: Api.Billing.CancelBillingCommand) {
  return request.del<void>({
    url: `${BILLING_BASE_URL}/${id}`,
    data
  })
}

/**
 * 记录支付（仅创建待审核支付记录，不会立即更新账单状态）
 * @param billingId 账单 ID
 * @param data 支付记录数据
 */
export function recordPayment(billingId: string, data: Api.Billing.RecordPaymentCommand) {
  return request.post<Api.Billing.PaymentRecordDto>({
    url: `${BILLING_BASE_URL}/${billingId}/payments`,
    data
  })
}

/**
 * 一键确认收款（记录支付 + 立即审核通过 + 同步更新账单状态）
 * @param billingId 账单 ID
 * @param data 支付记录数据
 */
export function confirmPayment(billingId: string, data: Api.Billing.RecordPaymentCommand) {
  return request.post<Api.Billing.PaymentRecordDto>({
    url: `${BILLING_BASE_URL}/${billingId}/payments/confirm`,
    data
  })
}

/**
 * 审核支付记录
 * @param paymentId 支付记录 ID
 * @param data 审核数据
 */
export function verifyPayment(paymentId: string, data: Api.Billing.VerifyPaymentCommand) {
  return request.put<Api.Billing.PaymentRecordDto>({
    url: `${BILLING_BASE_URL}/payments/${paymentId}/verify`,
    data
  })
}

/**
 * 批量更新账单状态
 * @param data 批量更新数据
 */
export function batchUpdateStatus(data: Api.Billing.BatchUpdateStatusCommand) {
  return request.post<void>({
    url: `${BILLING_BASE_URL}/batch/status`,
    data
  })
}

/**
 * 导出账单
 * @param data 导出参数
 * @returns Blob 对象（用于下载）
 */
export function exportBillings(data: Api.Billing.ExportParams) {
  return request.post<Blob>({
    url: `${BILLING_BASE_URL}/export`,
    data,
    responseType: 'blob'
  })
}

// ==================== 兼容导出（适配现有页面命名） ====================

/** 获取账单列表（兼容旧命名） */
export const fetchGetBillList = fetchBillingList

/** 获取账单详情（兼容旧命名） */
export const fetchGetBillDetail = fetchBillingDetail

/** 获取账单列表（导出用，兼容旧命名） */
export const fetchGetBillListForExport = fetchBillingListForExport

/** 创建账单（兼容旧命名） */
export const fetchCreateBill = createBilling

/** 更新账单状态（兼容旧命名） */
export const fetchUpdateBillStatus = updateBillingStatus

/** 记录支付（兼容旧命名） */
export const fetchRecordPayment = recordPayment
