import api from '@/utils/http'
import { fetchTenantPackageList } from './tenant-package'
import type { QuotaUsageHistoryDto, UpdateTenantCommand } from '@/types/tenant'

/**
 * 获取租户列表
 * @param params 搜索参数
 */
export function fetchGetTenantList(params?: Partial<Api.Tenant.TenantListParams>) {
  return api.get<Api.Tenant.TenantListResponse>({
    url: '/api/admin/v1/tenants',
    params
  })
}

/**
 * 注册租户
 */
export function fetchRegisterTenant(data: Api.Tenant.RegisterTenantCommand) {
  return api.post<Api.Tenant.TenantDto>({
    url: '/api/admin/v1/tenants',
    data
  })
}

/**
 * 后台手动新增租户并直接入驻（创建租户 + 认证 + 订阅 + 管理员账号）
 */
export function fetchCreateTenantManually(data: Api.Tenant.CreateTenantManuallyCommand) {
  return api.post<Api.Tenant.TenantDetailDto>({
    url: '/api/admin/v1/tenants/manual',
    data
  })
}

/**
 * 获取租户详情（包含认证信息、订阅信息）
 */
export function fetchGetTenantDetail(tenantId: string, options?: { showErrorMessage?: boolean }) {
  return api.get<Api.Tenant.TenantDetailDto>({
    url: `/api/admin/v1/tenants/${tenantId}`,
    showErrorMessage: options?.showErrorMessage
  })
}

/**
 * 获取租户配额使用情况
 */
export function fetchGetTenantQuotaUsage(
  tenantId: string,
  options?: { showErrorMessage?: boolean }
) {
  return api.get<Api.QuotaPackage.TenantQuotaUsageDto[]>({
    url: `/api/admin/v1/tenants/${tenantId}/quota-usage`,
    showErrorMessage: options?.showErrorMessage
  })
}

/**
 * 获取租户配额使用历史
 * @param tenantId 租户ID
 * @param params 分页参数
 */
export function fetchGetTenantQuotaUsageHistory(
  tenantId: string,
  params?: { Page?: number; PageSize?: number }
) {
  return api.get<Api.Common.PageResult<QuotaUsageHistoryDto>>({
    url: `/api/admin/v1/tenants/${tenantId}/quota-usage-history`,
    params
  })
}

/**
 * 获取订阅信息（注意：该接口为 POST）
 */
export function fetchGetTenantSubscriptions(
  tenantId: string,
  options?: { showErrorMessage?: boolean }
) {
  return api.post<Api.Tenant.TenantSubscriptionDto>({
    url: `/api/admin/v1/tenants/${tenantId}/subscriptions`,
    data: {},
    showErrorMessage: options?.showErrorMessage
  })
}

/**
 * 获取账单信息（分页，最近10条可传 Page=1 PageSize=10）
 */
export function fetchGetTenantBillings(
  tenantId: string,
  params: { Page?: number; PageSize?: number } = {},
  options?: { showErrorMessage?: boolean }
) {
  return api.get<Api.Common.PageResult<Api.Billing.BillingListDto>>({
    url: `/api/admin/v1/tenants/${tenantId}/billings`,
    params,
    showErrorMessage: options?.showErrorMessage
  })
}

/**
 * 更新租户信息（TD-001：待后端接口补充）
 * @param tenantId 租户ID（Snowflake long → string）
 * @param data 更新数据（tenantId 会以入参为准覆盖）
 * @returns void（后端 BaseResponse<void> 的 data 字段）
 *
 * 后端接口：PUT /api/admin/v1/tenants/{tenantId}
 * 预期响应：BaseResponse<void>
 * 预期错误码：400（参数错误）、404（租户不存在）、409（code 冲突）
 * TODO(TD-001): Swagger 中缺失该端点（当前可能返回 404/405），待后端补充后再联调验证
 */
export function fetchUpdateTenant(tenantId: string, data: UpdateTenantCommand) {
  return api.put<void>({
    url: `/api/admin/v1/tenants/${tenantId}`,
    data: { ...data, tenantId },
    showErrorMessage: false
  })
}

/**
 * 获取租户套餐列表（兼容旧调用）
 */
export const fetchGetTenantPackages = fetchTenantPackageList

/**
 * 审核租户
 */
export function fetchReviewTenant(
  tenantId: string,
  data: Omit<Api.Tenant.ReviewTenantCommand, 'tenantId'>
) {
  return api.post<Api.Tenant.TenantDto>({
    url: `/api/admin/v1/tenants/${tenantId}/review`,
    data: { ...data, tenantId }
  })
}

/**
 * 获取租户审核领取信息（未领取返回 null）
 */
export function fetchGetTenantReviewClaim(tenantId: string) {
  return api.get<Api.Tenant.TenantReviewClaimDto | null>({
    url: `/api/admin/v1/tenants/${tenantId}/review/claim`
  })
}

/**
 * 领取租户审核
 */
export function fetchClaimTenantReview(tenantId: string) {
  return api.post<Api.Tenant.TenantReviewClaimDto>({
    url: `/api/admin/v1/tenants/${tenantId}/review/claim`
  })
}

/**
 * 强制接管租户审核（仅超级管理员）
 */
export function fetchForceClaimTenantReview(tenantId: string) {
  return api.post<Api.Tenant.TenantReviewClaimDto>({
    url: `/api/admin/v1/tenants/${tenantId}/review/force-claim`
  })
}

/**
 * 释放租户审核领取（仅领取人）
 */
export function fetchReleaseTenantReviewClaim(tenantId: string) {
  return api.post<Api.Tenant.TenantReviewClaimDto | null>({
    url: `/api/admin/v1/tenants/${tenantId}/review/release`
  })
}

/**
 * 查询租户审核日志
 */
export function fetchGetTenantAuditLogs(
  tenantId: string,
  params: { page?: number; pageSize?: number } = {}
) {
  return api.get<Api.Tenant.TenantAuditLogListResponse>({
    url: `/api/admin/v1/tenants/${tenantId}/audits`,
    params: {
      page: params.page ?? 1,
      pageSize: params.pageSize ?? 20
    }
  })
}

/**
 * 冻结租户（暂停服务）
 */
export function fetchFreezeTenant(
  tenantId: string,
  data: Omit<Api.Tenant.FreezeTenantCommand, 'tenantId'>
) {
  return api.post<Api.Tenant.TenantDto>({
    url: `/api/admin/v1/tenants/${tenantId}/freeze`,
    data: { ...data, tenantId }
  })
}

/**
 * 解冻租户（恢复服务）
 */
export function fetchUnfreezeTenant(
  tenantId: string,
  data: Omit<Api.Tenant.UnfreezeTenantCommand, 'tenantId'> = {}
) {
  return api.post<Api.Tenant.TenantDto>({
    url: `/api/admin/v1/tenants/${tenantId}/unfreeze`,
    data: { ...data, tenantId }
  })
}

/**
 * 延期/赠送租户订阅时长（按当前订阅套餐续费）
 */
export function fetchExtendTenantSubscription(
  tenantId: string,
  data: Omit<Api.Tenant.ExtendTenantSubscriptionCommand, 'tenantId'>
) {
  return api.post<Api.Tenant.TenantSubscriptionDto>({
    url: `/api/admin/v1/tenants/${tenantId}/subscriptions/extend`,
    data: { ...data, tenantId }
  })
}

/**
 * 伪装登录租户（返回租户主管理员的 Token）
 */
export function fetchImpersonateTenant(tenantId: string) {
  return api.post<Api.Auth.TokenResponse>({
    url: `/api/admin/v1/tenants/${tenantId}/impersonate`
  })
}

/**
 * 生成租户主管理员重置密码链接（仅展示一次）
 */
export function fetchCreateTenantAdminResetLink(tenantId: string) {
  return api.post<string>({
    url: `/api/admin/v1/tenants/${tenantId}/admin/reset-link`
  })
}

/**
 * 获取租户配额购买记录（分页）
 */
export function fetchGetTenantQuotaPurchases(
  tenantId: string,
  params: { Page?: number; PageSize?: number } = {}
) {
  return api.get<Api.Common.PageResult<Api.QuotaPackage.TenantQuotaPurchaseDto>>({
    url: `/api/admin/v1/tenants/${tenantId}/quota-purchases`,
    params: {
      Page: params.Page ?? 1,
      PageSize: params.PageSize ?? 10
    }
  })
}
