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

// ==================== 悬浮球类型枚举 ====================

/** 悬浮球类型枚举 */
export enum FloatBallType {
  /** 展示图片 */
  ShowImage = 1,
  /** 跳转页面 */
  JumpPage = 2
}

/** 悬浮球类型标签映射 */
export const FloatBallTypeLabels: Record<number, string> = {
  [FloatBallType.ShowImage]: '展示图片',
  [FloatBallType.JumpPage]: '跳转页面'
}

/** 悬浮球特效枚举 */
export enum FloatBallEffect {
  /** 无特效 */
  None = 0,
  /** 缩放动画 */
  Scale = 1
}

/** 悬浮球特效标签映射 */
export const FloatBallEffectLabels: Record<number, string> = {
  [FloatBallEffect.None]: '无特效',
  [FloatBallEffect.Scale]: '缩放动画'
}

// ==================== 悬浮球类型定义 ====================

/** 悬浮球列表查询请求 */
export interface FloatBallListRequest {
  /** 页码 */
  page: number
  /** 每页数量 */
  pageSize: number
}

/** 悬浮球响应 */
export interface FloatBallResponse {
  /** 主键ID */
  id: number
  /** 标题 */
  title?: string
  /** 类型: 1展示图片 2跳转页面 */
  type: number
  /** 悬浮球图片URL */
  image: string
  /** 背景图片URL */
  imageBj?: string
  /** 详情图片URL */
  imageDetails?: string
  /** 跳转链接 */
  linkUrl: string
  /** X轴位置 */
  positionX: string
  /** Y轴位置 */
  positionY: string
  /** 宽度 */
  width: string
  /** 高度 */
  height: string
  /** 详情图片X偏移 */
  imageDetailsX?: string
  /** 详情图片Y偏移 */
  imageDetailsY?: string
  /** 详情图片宽度 */
  imageDetailsW?: string
  /** 详情图片高度 */
  imageDetailsH?: string
  /** 特效: 0无 1缩放动画 */
  effect: number
  /** 状态: 0关闭 1开启 */
  status: number
  /** 创建时间 */
  createdAt: string
}

/** 悬浮球创建请求 */
export interface FloatBallCreateRequest {
  /** 标题 */
  title?: string
  /** 类型: 1展示图片 2跳转页面 */
  type: number
  /** 悬浮球图片URL（必填） */
  image: string
  /** 背景图片URL */
  imageBj?: string
  /** 详情图片URL */
  imageDetails?: string
  /** 跳转链接（类型为跳转页面时使用） */
  linkUrl?: string
  /** X轴位置（必填） */
  positionX: string
  /** Y轴位置（必填） */
  positionY: string
  /** 宽度（必填） */
  width: string
  /** 高度（必填） */
  height: string
  /** 详情图片X偏移 */
  imageDetailsX?: string
  /** 详情图片Y偏移 */
  imageDetailsY?: string
  /** 详情图片宽度 */
  imageDetailsW?: string
  /** 详情图片高度 */
  imageDetailsH?: string
  /** 特效: 0无 1缩放动画（必填） */
  effect: number
  /** 状态: 0关闭 1开启，默认开启 */
  status?: number
}

/** 悬浮球更新请求 */
export interface FloatBallUpdateRequest {
  /** 标题 */
  title?: string
  /** 类型: 1展示图片 2跳转页面 */
  type: number
  /** 悬浮球图片URL（必填） */
  image: string
  /** 背景图片URL */
  imageBj?: string
  /** 详情图片URL */
  imageDetails?: string
  /** 跳转链接（类型为跳转页面时使用） */
  linkUrl?: string
  /** X轴位置（必填） */
  positionX: string
  /** Y轴位置（必填） */
  positionY: string
  /** 宽度（必填） */
  width: string
  /** 高度（必填） */
  height: string
  /** 详情图片X偏移 */
  imageDetailsX?: string
  /** 详情图片Y偏移 */
  imageDetailsY?: string
  /** 详情图片宽度 */
  imageDetailsW?: string
  /** 详情图片高度 */
  imageDetailsH?: string
  /** 特效: 0无 1缩放动画（必填） */
  effect: number
  /** 状态: 0关闭 1开启 */
  status: number
}

/** 悬浮球状态切换请求 */
export interface FloatBallStatusRequest {
  /** 状态: 0关闭 1开启 */
  status: number
}

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

const FLOATBALL_BASE_URL = '/admin/business/floatball'

// ==================== 悬浮球配置 API ====================

/**
 * 获取悬浮球列表（分页）
 * @param params 查询参数
 * @returns 分页悬浮球列表
 */
export function getFloatBalls(params: FloatBallListRequest): Promise<ApiResponse<PagedResult<FloatBallResponse>>> {
  return request({
    url: FLOATBALL_BASE_URL,
    method: 'get',
    params
  })
}

/**
 * 获取悬浮球详情
 * @param id 悬浮球ID
 * @returns 悬浮球详情
 */
export function getFloatBallById(id: number): Promise<ApiResponse<FloatBallResponse>> {
  return request({
    url: `${FLOATBALL_BASE_URL}/${id}`,
    method: 'get'
  })
}

/**
 * 创建悬浮球
 * @param data 创建请求数据
 * @returns 新悬浮球ID
 */
export function createFloatBall(data: FloatBallCreateRequest): Promise<ApiResponse<{ id: number }>> {
  return request({
    url: FLOATBALL_BASE_URL,
    method: 'post',
    data
  })
}

/**
 * 更新悬浮球
 * @param id 悬浮球ID
 * @param data 更新请求数据
 * @returns 操作结果
 */
export function updateFloatBall(id: number, data: FloatBallUpdateRequest): Promise<ApiResponse<string>> {
  return request({
    url: `${FLOATBALL_BASE_URL}/${id}`,
    method: 'put',
    data
  })
}

/**
 * 删除悬浮球
 * @param id 悬浮球ID
 * @returns 操作结果
 */
export function deleteFloatBall(id: number): Promise<ApiResponse<string>> {
  return request({
    url: `${FLOATBALL_BASE_URL}/${id}`,
    method: 'delete'
  })
}

/**
 * 切换悬浮球状态
 * @param id 悬浮球ID
 * @param data 状态请求数据
 * @returns 操作结果
 */
export function updateFloatBallStatus(id: number, data: FloatBallStatusRequest): Promise<ApiResponse<string>> {
  return request({
    url: `${FLOATBALL_BASE_URL}/${id}/status`,
    method: 'put',
    data
  })
}
