import { request, type ApiResponse, type PagedResult } from '@/utils/request'
import type { RewardResponse, RewardItem } from './reward'

// ==================== 签到类型枚举 ====================

/** 签到类型枚举 */
export enum SignType {
  /** 每日签到 */
  Daily = 1,
  /** 累计签到 */
  Cumulative = 2
}

/** 签到类型标签映射 */
export const SignTypeLabels: Record<number, string> = {
  [SignType.Daily]: '每日签到',
  [SignType.Cumulative]: '累计签到'
}

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

/** 签到配置列表查询请求 */
export interface SignConfigListRequest {
  /** 页码 */
  page: number
  /** 每页数量 */
  pageSize: number
  /** 签到类型筛选：1-每日签到 2-累计签到 */
  type: number
  /** 关键词搜索（搜索标题） */
  keyword?: string
}

/** 签到配置响应 */
export interface SignConfigResponse {
  /** 主键ID */
  id: number
  /** 签到类型：1-每日签到 2-累计签到 */
  type: number
  /** 签到类型名称 */
  typeName: string
  /** 签到天数 */
  day?: number
  /** 标题 */
  title?: string
  /** 图标URL */
  icon?: string
  /** 状态：1-启用 0-禁用 */
  status: number
  /** 排序 */
  sort?: number
  /** 奖励ID（业务标识） */
  rewardId: string
  /** 描述 */
  description?: string
  /** 创建时间 */
  createdAt?: string
  /** 更新时间 */
  updatedAt?: string
  /** 关联的奖励列表 */
  rewards: RewardResponse[]
}

/** 签到配置创建请求 */
export interface SignConfigCreateRequest {
  /** 签到类型：1-每日签到 2-累计签到 */
  type: number
  /** 签到天数 */
  day?: number
  /** 标题 */
  title: string
  /** 图标URL */
  icon?: string
  /** 排序 */
  sort?: number
  /** 描述 */
  description?: string
  /** 奖励列表 */
  rewards: RewardItem[]
}

/** 签到配置更新请求 */
export interface SignConfigUpdateRequest {
  /** 签到类型：1-每日签到 2-累计签到 */
  type: number
  /** 签到天数 */
  day?: number
  /** 标题 */
  title: string
  /** 图标URL */
  icon?: string
  /** 排序 */
  sort?: number
  /** 描述 */
  description?: string
}

/** 签到配置状态更新请求 */
export interface SignConfigStatusRequest {
  /** 状态：1-启用 0-禁用 */
  status: number
}

/** 签到配置排序更新请求 */
export interface SignConfigSortRequest {
  /** 排序值 */
  sort: number
}

/** 签到配置奖励更新请求 */
export interface SignConfigRewardRequest {
  /** 奖励列表 */
  rewards: RewardItem[]
}

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

const SIGNCONFIG_BASE_URL = '/admin/business/signconfig'

// ==================== 签到配置 API ====================

/**
 * 获取签到配置列表（分页）
 * @param params 查询参数
 * @returns 分页签到配置列表
 */
export function getSignConfigs(params: SignConfigListRequest): Promise<ApiResponse<PagedResult<SignConfigResponse>>> {
  return request({
    url: SIGNCONFIG_BASE_URL,
    method: 'get',
    params
  })
}

/**
 * 获取签到配置详情
 * @param id 签到配置ID
 * @returns 签到配置详情
 */
export function getSignConfigById(id: number): Promise<ApiResponse<SignConfigResponse>> {
  return request({
    url: `${SIGNCONFIG_BASE_URL}/${id}`,
    method: 'get'
  })
}

/**
 * 创建签到配置
 * @param data 创建请求数据
 * @returns 新签到配置ID
 */
export function createSignConfig(data: SignConfigCreateRequest): Promise<ApiResponse<{ id: number }>> {
  return request({
    url: SIGNCONFIG_BASE_URL,
    method: 'post',
    data
  })
}

/**
 * 更新签到配置
 * @param id 签到配置ID
 * @param data 更新请求数据
 * @returns 操作结果
 */
export function updateSignConfig(id: number, data: SignConfigUpdateRequest): Promise<ApiResponse<string>> {
  return request({
    url: `${SIGNCONFIG_BASE_URL}/${id}`,
    method: 'put',
    data
  })
}

/**
 * 删除签到配置
 * @param id 签到配置ID
 * @returns 操作结果
 */
export function deleteSignConfig(id: number): Promise<ApiResponse<string>> {
  return request({
    url: `${SIGNCONFIG_BASE_URL}/${id}`,
    method: 'delete'
  })
}

/**
 * 更新签到配置状态
 * @param id 签到配置ID
 * @param data 状态请求数据
 * @returns 操作结果
 */
export function updateSignConfigStatus(id: number, data: SignConfigStatusRequest): Promise<ApiResponse<string>> {
  return request({
    url: `${SIGNCONFIG_BASE_URL}/${id}/status`,
    method: 'put',
    data
  })
}

/**
 * 更新签到配置排序
 * @param id 签到配置ID
 * @param data 排序请求数据
 * @returns 操作结果
 */
export function updateSignConfigSort(id: number, data: SignConfigSortRequest): Promise<ApiResponse<string>> {
  return request({
    url: `${SIGNCONFIG_BASE_URL}/${id}/sort`,
    method: 'put',
    data
  })
}

/**
 * 更新签到配置奖励
 * @param id 签到配置ID
 * @param data 奖励请求数据
 * @returns 操作结果
 */
export function updateSignConfigReward(id: number, data: SignConfigRewardRequest): Promise<ApiResponse<string>> {
  return request({
    url: `${SIGNCONFIG_BASE_URL}/${id}/reward`,
    method: 'put',
    data
  })
}
