import { request, type ApiResponse } from '@/utils/request'

// ==================== 配置键类型定义 ====================

/** 配置键类型 */
export type ConfigKey =
  | 'base'
  | 'weixinpay_setting'
  | 'alipay_setting'
  | 'miniprogram_setting'
  | 'h5_setting'
  | 'uploads'
  | 'sign'
  | 'systemconfig'
  | 'app_setting'
  | 'user_config'
  | 'infinite_multiple'
  | 'rank_setting'
  | 'system_test'
  | 'tencent_sms_config'

/** 配置键标签映射 */
export const ConfigKeyLabels: Record<ConfigKey, string> = {
  base: '基础设置',
  weixinpay_setting: '微信支付配置',
  alipay_setting: '支付宝配置',
  miniprogram_setting: '小程序配置',
  h5_setting: 'H5配置',
  uploads: '上传配置',
  sign: '签到配置',
  systemconfig: '系统配置',
  app_setting: '应用设置',
  user_config: '用户UID设置',
  infinite_multiple: '无限赏抽奖倍数',
  rank_setting: '排行榜设置',
  system_test: '内测配置',
  tencent_sms_config: '腾讯短信配置'
}

// ==================== 基础设置类型定义 ====================

/** 基础设置 */
export interface BaseSetting {
  /** 网站名称 */
  title?: string
  /** 物流code */
  logistics_code?: string
  /** 连击赏最大抽取次数 */
  lianji_max_num?: string
  /** 分销奖励比例 */
  fx_bili?: string
  /** 赏券每人每天最多领取次数 */
  coupon_ling_max_ci?: string
  /** 特级赏券限制参与人数 */
  coupon_a_xz_max?: string
  /** 终极赏券限制参与人数 */
  coupon_b_xz_max?: string
  /** 高级赏券限制参与人数 */
  coupon_c_xz_max?: string
  /** 普通赏券限制参与人数 */
  coupon_d_xz_max?: string
  /** 背包满多少包邮 */
  free_post?: string
  /** 背包发货运费 */
  post_money?: string
  /** 一番赏三发+时间(秒) */
  three_time?: string
  /** 一番赏五发+时间(秒) */
  five_time?: string
  /** 福利进群二维码 */
  erweima?: string
  /** 分享标题 */
  share_title?: string
  /** 分享图片 */
  share_image?: string
  /** 海报模板图片URL */
  poster_template?: string
  /** 海报二维码X坐标 */
  poster_qr_x?: string
  /** 海报二维码Y坐标 */
  poster_qr_y?: string
  /** 海报二维码大小 */
  poster_qr_size?: string
  /** 站点URL */
  site_url?: string
  /** 抽奖券拉人上限 */
  draw_people_num?: string
  /** 首页是否弹窗 0关闭 1开启 */
  is_shou_tan?: string
  /** 兑换开关 0关闭 1开启 */
  is_exchange?: string
}

// ==================== 微信支付配置类型定义 ====================


/** 支付版本枚举 */
export enum PayVersion {
  V2 = 'V2',
  V3 = 'V3'
}

/** 支付版本标签映射 */
export const PayVersionLabels: Record<string, string> = {
  [PayVersion.V2]: 'V2 (XML/MD5)',
  [PayVersion.V3]: 'V3 (JSON/RSA)'
}

/** 微信支付商户配置 */
export interface WeixinPayMerchant {
  /** 商户名称 */
  name: string
  /** 商户号 */
  mch_id: string
  /** 订单前缀（必须3位） */
  order_prefix: string
  /** API密钥 (V2) */
  api_key?: string
  /** 证书路径 (V2) */
  cert_path?: string
  /** 是否启用 */
  is_enabled?: string
  /** 支付回调地址 */
  notify_url?: string
  
  // ===== V3 新增字段 =====
  
  /** 支付版本: "V2" 或 "V3"，默认 "V2" */
  pay_version?: string
  /** APIv3 密钥（32位字符串） */
  api_v3_key?: string
  /** 商户API证书序列号 */
  cert_serial_no?: string
  /** 商户私钥文件路径 */
  private_key_path?: string
  /** 微信支付公钥ID */
  wechat_public_key_id?: string
  /** 微信支付公钥文件路径 */
  wechat_public_key_path?: string
}

/** 微信支付配置 */
export interface WeixinPaySetting {
  /** 商户列表 */
  merchants: WeixinPayMerchant[]
}

// ==================== 支付宝配置类型定义 ====================

/** 支付宝商户配置 */
export interface AlipayMerchant {
  /** 商户名称 */
  name: string
  /** 应用ID */
  appId: string
  /** 应用私钥 */
  privateKey?: string
  /** 支付宝公钥 */
  publicKey?: string
  /** 权重 */
  weight: number
  /** 是否启用 0禁用 1启用 */
  is_enabled: number
  /** 备注 */
  remark?: string
}

/** 支付宝配置 */
export interface AlipaySetting {
  /** 商户列表 */
  merchants: AlipayMerchant[]
}

// ==================== 小程序配置类型定义 ====================

/** 小程序配置项 */
export interface MiniprogramConfig {
  /** 小程序名称 */
  name: string
  /** AppId */
  appid: string
  /** AppSecret */
  appsecret?: string
  /** 订单前缀（必须2位） */
  order_prefix?: string
  /** 是否默认 0否 1是 */
  is_default: number
  /** 关联商户列表 */
  merchants?: string[]
}

/** 小程序配置 */
export interface MiniprogramSetting {
  /** 小程序列表 */
  miniprograms: MiniprogramConfig[]
}

// ==================== H5配置类型定义 ====================

/** H5应用配置项 */
export interface H5AppConfig {
  /** 应用名称 */
  name: string
  /** AppId */
  appid?: string
  /** AppSecret */
  appsecret?: string
  /** 域名（逗号分隔） */
  domain?: string
  /** 订单前缀（必须2位） */
  order_prefix?: string
  /** 是否默认 0否 1是 */
  is_default: number
  /** 支付方式 alipay/wechat */
  pay_type?: string
  /** 微信商户ID列表 */
  wx_merchants?: string[]
  /** 支付宝商户索引 */
  ali_merchant_index?: number
}

/** H5配置 */
export interface H5Setting {
  /** H5应用列表 */
  h5apps: H5AppConfig[]
}

// ==================== 上传配置类型定义 ====================

/** 存储类型枚举 */
export enum StorageType {
  Local = '1',
  Aliyun = '2',
  Tencent = '3'
}

/** 存储类型标签映射 */
export const StorageTypeLabels: Record<string, string> = {
  [StorageType.Local]: '本地存储',
  [StorageType.Aliyun]: '阿里云OSS',
  [StorageType.Tencent]: '腾讯云COS'
}

/** 上传配置 */
export interface UploadSetting {
  /** 存储类型 1本地 2阿里云 3腾讯云 */
  type?: string
  /** 腾讯云AppId */
  AppId?: string
  /** 空间名称/Bucket */
  Bucket?: string
  /** 地域 */
  Region?: string
  /** AccessKeyId */
  AccessKeyId?: string
  /** AccessKeySecret */
  AccessKeySecret?: string
  /** 请求域名 */
  Domain?: string
}

// ==================== 签到配置类型定义 ====================

/** 签到配置 */
export interface SignSetting {
  /** 第一天奖励 */
  one_num?: string
  /** 第二天奖励 */
  two_num?: string
  /** 第三天奖励 */
  three_num?: string
  /** 第四天奖励 */
  four_num?: string
  /** 第五天奖励 */
  five_num?: string
  /** 第六天奖励 */
  six_num?: string
  /** 第七天奖励 */
  seven_num?: string
}


// ==================== 应用设置类型定义 ====================

/** 应用设置 */
export interface AppSetting {
  /** 项目名称 */
  app_name?: string
  /** 购买弹窗 1弹出一次 2每天显示 */
  purchase_popup?: string
  /** 商城购买次数 */
  exchange_times?: string
  /** 余额名称 */
  balance_name?: string
  /** 余额图标 */
  balance_icon?: string
  /** 货币1名称 */
  currency1_name?: string
  /** 货币1图标 */
  currency1_icon?: string
  /** 货币2名称 */
  currency2_name?: string
  /** 货币2图标 */
  currency2_icon?: string
  /** 中奖音频 */
  win_audio?: string
  /** 小程序版本号 */
  version?: string
  /** 签到消费门槛 */
  sign_threshold?: string
  /** 显示兑换达达券按钮门槛 */
  exchange_show_threshold?: string
  /** 外卖盒子ID */
  takeout_box_id?: string
  /** 每日免费抽奖ID */
  daily_free_draw_id?: string
  /** 盒柜兑换次数限制 */
  box_exchange_limit?: string
  /** 每天优惠券次数 */
  daily_coupon_limit?: string
}

// ==================== 用户UID配置类型定义 ====================

/** UID类型枚举 */
export enum UidType {
  RealId = '1',
  NumberId = '2',
  RandomId = '3'
}

/** UID类型标签映射 */
export const UidTypeLabels: Record<string, string> = {
  [UidType.RealId]: '真实ID',
  [UidType.NumberId]: '数字ID',
  [UidType.RandomId]: '随机字符和数字'
}

/** 用户UID配置 */
export interface UserConfigSetting {
  /** UID类型 1真实ID 2数字ID 3随机字符和数字 */
  uid_type?: string
  /** UID长度 */
  uid_length?: string
}

// ==================== 内测配置类型定义 ====================

/** 内测配置 */
export interface SystemTestSetting {
  /** 是否开启内测 0关闭 1开启 */
  enable_test?: string
  /** 是否禁用微信支付 0启用 1禁用 */
  disable_wechat_pay?: string
  /** 签到倍数 */
  sign_multiple?: string
}

// ==================== 无限赏抽奖倍数类型定义 ====================

/** 无限赏抽奖倍数配置 */
export interface InfiniteMultipleSetting {
  /** 抽奖倍数 1000/10000/100000 */
  multiple?: string
}

// ==================== 排行榜设置类型定义 ====================

/** 排行榜统计方式枚举 */
export enum RankStatType {
  Daily = 'daily',
  Weekly = 'weekly',
  Monthly = 'monthly',
  Yearly = 'yearly',
  Custom = 'custom'
}

/** 排行榜统计方式标签映射 */
export const RankStatTypeLabels: Record<string, string> = {
  [RankStatType.Daily]: '每日',
  [RankStatType.Weekly]: '每周',
  [RankStatType.Monthly]: '每月',
  [RankStatType.Yearly]: '每年',
  [RankStatType.Custom]: '自定义'
}

/** 排行榜设置 */
export interface RankSettingSetting {
  /** 达达券排行榜统计方式 daily/weekly/monthly/yearly/custom */
  dadajuan_stat_type?: string
  /** 达达券自定义开始时间 */
  dadajuan_start_time?: string
  /** 达达券自定义结束时间 */
  dadajuan_end_time?: string
  /** 钻石排行榜统计方式 */
  diamond_stat_type?: string
  /** 钻石自定义开始时间 */
  diamond_start_time?: string
  /** 钻石自定义结束时间 */
  diamond_end_time?: string
  /** UU币排行榜统计方式 */
  integral_stat_type?: string
  /** UU币自定义开始时间 */
  integral_start_time?: string
  /** UU币自定义结束时间 */
  integral_end_time?: string
  /** 邀请排行榜统计方式 */
  invite_stat_type?: string
  /** 邀请自定义开始时间 */
  invite_start_time?: string
  /** 邀请自定义结束时间 */
  invite_end_time?: string
}


// ==================== 配置响应类型定义 ====================

/** 配置响应 */
export interface ConfigResponse<T = unknown> {
  /** 配置键 */
  key: string
  /** 配置值 */
  value: T | null
}

// ==================== 配置类型映射 ====================

/** 配置键到类型的映射 */
export interface ConfigTypeMap {
  base: BaseSetting
  weixinpay_setting: WeixinPaySetting
  alipay_setting: AlipaySetting
  miniprogram_setting: MiniprogramSetting
  h5_setting: H5Setting
  uploads: UploadSetting
  sign: SignSetting
  systemconfig: Record<string, unknown>
  app_setting: AppSetting
  user_config: UserConfigSetting
  infinite_multiple: InfiniteMultipleSetting
  rank_setting: RankSettingSetting
  system_test: SystemTestSetting
  tencent_sms_config: Record<string, unknown>
}

// ==================== API 基础路径 ====================

const CONFIG_BASE_URL = '/admin/business/config'

// ==================== 配置管理 API ====================

/**
 * 获取配置
 * @param key 配置键
 * @returns 配置数据
 */
export function getConfig<K extends ConfigKey>(
  key: K
): Promise<ApiResponse<ConfigResponse<ConfigTypeMap[K]>>> {
  return request({
    url: `${CONFIG_BASE_URL}/${key}`,
    method: 'get'
  })
}

/**
 * 更新配置
 * @param key 配置键
 * @param value 配置值
 * @returns 更新结果
 */
export function updateConfig<K extends ConfigKey>(
  key: K,
  value: ConfigTypeMap[K]
): Promise<ApiResponse<string>> {
  return request({
    url: `${CONFIG_BASE_URL}/${key}`,
    method: 'put',
    data: { value }
  })
}

/**
 * 清理配置缓存
 * @param key 配置键
 * @returns 清理结果
 */
export function clearConfigCache(key: ConfigKey): Promise<ApiResponse<string>> {
  return request({
    url: `${CONFIG_BASE_URL}/${key}/cache`,
    method: 'delete'
  })
}

/**
 * 获取所有支持的配置键
 * @returns 配置键列表
 */
export function getConfigKeys(): Promise<ApiResponse<string[]>> {
  return request({
    url: `${CONFIG_BASE_URL}/keys`,
    method: 'get'
  })
}

// ==================== 便捷方法 ====================

/**
 * 获取基础设置
 * @returns 基础设置数据
 */
export function getBaseSetting(): Promise<ApiResponse<ConfigResponse<BaseSetting>>> {
  return getConfig('base')
}

/**
 * 更新基础设置
 * @param value 基础设置数据
 * @returns 更新结果
 */
export function updateBaseSetting(value: BaseSetting): Promise<ApiResponse<string>> {
  return updateConfig('base', value)
}

/**
 * 获取微信支付配置
 * @returns 微信支付配置数据
 */
export function getWeixinPaySetting(): Promise<ApiResponse<ConfigResponse<WeixinPaySetting>>> {
  return getConfig('weixinpay_setting')
}

/**
 * 更新微信支付配置
 * @param value 微信支付配置数据
 * @returns 更新结果
 */
export function updateWeixinPaySetting(value: WeixinPaySetting): Promise<ApiResponse<string>> {
  return updateConfig('weixinpay_setting', value)
}

/**
 * 获取支付宝配置
 * @returns 支付宝配置数据
 */
export function getAlipaySetting(): Promise<ApiResponse<ConfigResponse<AlipaySetting>>> {
  return getConfig('alipay_setting')
}

/**
 * 更新支付宝配置
 * @param value 支付宝配置数据
 * @returns 更新结果
 */
export function updateAlipaySetting(value: AlipaySetting): Promise<ApiResponse<string>> {
  return updateConfig('alipay_setting', value)
}

/**
 * 获取小程序配置
 * @returns 小程序配置数据
 */
export function getMiniprogramSetting(): Promise<ApiResponse<ConfigResponse<MiniprogramSetting>>> {
  return getConfig('miniprogram_setting')
}

/**
 * 更新小程序配置
 * @param value 小程序配置数据
 * @returns 更新结果
 */
export function updateMiniprogramSetting(value: MiniprogramSetting): Promise<ApiResponse<string>> {
  return updateConfig('miniprogram_setting', value)
}

/**
 * 获取H5配置
 * @returns H5配置数据
 */
export function getH5Setting(): Promise<ApiResponse<ConfigResponse<H5Setting>>> {
  return getConfig('h5_setting')
}

/**
 * 更新H5配置
 * @param value H5配置数据
 * @returns 更新结果
 */
export function updateH5Setting(value: H5Setting): Promise<ApiResponse<string>> {
  return updateConfig('h5_setting', value)
}

/**
 * 获取上传配置
 * @returns 上传配置数据
 */
export function getUploadSetting(): Promise<ApiResponse<ConfigResponse<UploadSetting>>> {
  return getConfig('uploads')
}

/**
 * 更新上传配置
 * @param value 上传配置数据
 * @returns 更新结果
 */
export function updateUploadSetting(value: UploadSetting): Promise<ApiResponse<string>> {
  return updateConfig('uploads', value)
}

/**
 * 获取签到配置
 * @returns 签到配置数据
 */
export function getSignSetting(): Promise<ApiResponse<ConfigResponse<SignSetting>>> {
  return getConfig('sign')
}

/**
 * 更新签到配置
 * @param value 签到配置数据
 * @returns 更新结果
 */
export function updateSignSetting(value: SignSetting): Promise<ApiResponse<string>> {
  return updateConfig('sign', value)
}

/**
 * 获取应用设置
 * @returns 应用设置数据
 */
export function getAppSetting(): Promise<ApiResponse<ConfigResponse<AppSetting>>> {
  return getConfig('app_setting')
}

/**
 * 更新应用设置
 * @param value 应用设置数据
 * @returns 更新结果
 */
export function updateAppSetting(value: AppSetting): Promise<ApiResponse<string>> {
  return updateConfig('app_setting', value)
}

/**
 * 获取用户UID配置
 * @returns 用户UID配置数据
 */
export function getUserConfigSetting(): Promise<ApiResponse<ConfigResponse<UserConfigSetting>>> {
  return getConfig('user_config')
}

/**
 * 更新用户UID配置
 * @param value 用户UID配置数据
 * @returns 更新结果
 */
export function updateUserConfigSetting(value: UserConfigSetting): Promise<ApiResponse<string>> {
  return updateConfig('user_config', value)
}

/**
 * 获取内测配置
 * @returns 内测配置数据
 */
export function getSystemTestSetting(): Promise<ApiResponse<ConfigResponse<SystemTestSetting>>> {
  return getConfig('system_test')
}

/**
 * 更新内测配置
 * @param value 内测配置数据
 * @returns 更新结果
 */
export function updateSystemTestSetting(value: SystemTestSetting): Promise<ApiResponse<string>> {
  return updateConfig('system_test', value)
}

/**
 * 获取无限赏抽奖倍数配置
 * @returns 无限赏抽奖倍数配置数据
 */
export function getInfiniteMultipleSetting(): Promise<ApiResponse<ConfigResponse<InfiniteMultipleSetting>>> {
  return getConfig('infinite_multiple')
}

/**
 * 更新无限赏抽奖倍数配置
 * @param value 无限赏抽奖倍数配置数据
 * @returns 更新结果
 */
export function updateInfiniteMultipleSetting(value: InfiniteMultipleSetting): Promise<ApiResponse<string>> {
  return updateConfig('infinite_multiple', value)
}

/**
 * 获取排行榜设置
 * @returns 排行榜设置数据
 */
export function getRankSettingSetting(): Promise<ApiResponse<ConfigResponse<RankSettingSetting>>> {
  return getConfig('rank_setting')
}

/**
 * 更新排行榜设置
 * @param value 排行榜设置数据
 * @returns 更新结果
 */
export function updateRankSettingSetting(value: RankSettingSetting): Promise<ApiResponse<string>> {
  return updateConfig('rank_setting', value)
}

// ==================== 海报缓存管理 ====================

/** 清除海报缓存响应 */
export interface ClearPosterCacheResponse {
  message: string
  count: number
}

/**
 * 清除所有用户海报缓存
 * @returns 清除结果
 */
export function clearPosterCache(): Promise<ApiResponse<ClearPosterCacheResponse>> {
  return request({
    url: `${CONFIG_BASE_URL}/poster-cache`,
    method: 'delete'
  })
}
