import request from '@/utils/request'
import type { ApiResult, PageResult } from '@/api'
import type { AppProduct, AppProductParam } from './model'
import { APP_API_URL } from '@/config/setting'

const BASE = APP_API_URL + '/product'

// ============ 基础 CRUD ============

/** 分页查询应用产品 */
export async function pageAppProduct(params: AppProductParam) {
  const res = await request.get<ApiResult<PageResult<AppProduct>>>(BASE + '/page', { params })
  if (res.data.code === 0) return res.data.data
  return Promise.reject(new Error(res.data.message))
}

/** 分页查询应用产品（别名，兼容 cmsWebsite 接口） */
export const page = pageAppProduct

/** 分页查询应用产品（别名，兼容旧代码） */
export async function pageAppProductAll(params: AppProductParam) {
  return pageAppProduct(params)
}

/** 获取应用产品详情 */
export async function getAppProduct(productId: number) {
  const res = await request.get<ApiResult<AppProduct>>(BASE + '/detail/' + productId)
  if (res.data.code === 0) return res.data.data
  return Promise.reject(new Error(res.data.message))
}

/** 获取应用产品详情ByCode */
export async function getAppProductByCode(code: string) {
  const res = await request.get<ApiResult<AppProduct>>(BASE + '/info/' + code)
  if (res.data.code === 0) return res.data.data
  return Promise.reject(new Error(res.data.message))
}

/** 新增应用产品 */
export async function addAppProduct(data: Partial<AppProduct>) {
  const res = await request.post<ApiResult<AppProduct>>(BASE + '/create', data)
  if (res.data.code === 0) return res.data.data
  return Promise.reject(new Error(res.data.message))
}

/** 修改应用产品 */
export async function updateAppProduct(data: Partial<AppProduct>) {
  const res = await request.put<ApiResult<unknown>>(BASE + '/update', data)
  if (res.data.code === 0) return res.data.message
  return Promise.reject(new Error(res.data.message))
}

/** 删除应用产品 */
export async function removeAppProduct(id: number) {
  const res = await request.delete<ApiResult<unknown>>(BASE + '/delete/' + id)
  if (res.data.code === 0) return res.data.message
  return Promise.reject(new Error(res.data.message))
}

// ============ 开发者相关 ============

/** 获取开发者应用列表 */
export async function getDeveloperApps(params?: AppProductParam) {
  const res = await request.get<ApiResult<AppProduct[]>>(BASE + '/list', { params })
  if (res.data.code === 0 && res.data.data) return res.data.data
  return Promise.reject(new Error(res.data.message))
}

/** 分页查询我的应用（创建者） */
export async function getMyApps(params: { page?: number; limit?: number }) {
  const res = await request.get<ApiResult<PageResult<AppProduct>>>(BASE + '/my/page', { params })
  if (res.data.code === 0) return res.data.data
  return Promise.reject(new Error(res.data.message))
}

/** 分页查询我参与的应用 */
export async function getJoinedApps(params: { page?: number; limit?: number }) {
  const res = await request.get<ApiResult<PageResult<AppProduct>>>(BASE + '/joined/page', { params })
  if (res.data.code === 0) return res.data.data
  return Promise.reject(new Error(res.data.message))
}

/** 开发者提交审核 */
export async function submitReview(id: number) {
  const res = await request.post<ApiResult<unknown>>(BASE + '/submit/' + id)
  if (res.data.code === 0) return res.data.message
  return Promise.reject(new Error(res.data.message))
}

/** 提交发布审核（别名） */
export const submitPublishReview = submitReview

/** 撤回审核申请 */
export async function withdrawPublishReview(id: number) {
  const res = await request.post<ApiResult<unknown>>(BASE + '/withdraw/' + id)
  if (res.data.code === 0) return res.data.message
  return Promise.reject(new Error(res.data.message))
}

/** 开发者下架应用 */
export async function deprecated(id: number) {
  const res = await request.post<ApiResult<unknown>>(BASE + '/unpublish/' + id)
  if (res.data.code === 0) return res.data.message
  return Promise.reject(new Error(res.data.message))
}

/** 下架应用（别名） */
export const unpublishAppProduct = deprecated

// ============ 市场相关 ============

/** 获取市场应用列表 */
export async function getMarketApps(params: AppProductParam) {
  const res = await request.get<ApiResult<PageResult<AppProduct>>>(BASE + '/market/page', { params })
  if (res.data.code === 0) return res.data.data
  return Promise.reject(new Error(res.data.message))
}

/** 获取市场应用详情 */
export async function getMarketApp(productId: number) {
  const res = await request.get<ApiResult<AppProduct>>(BASE + '/detail/' + productId)
  if (res.data.code === 0) return res.data.data
  return Promise.reject(new Error(res.data.message))
}

// ============ 管理后台 ============

/** 获取待审核列表 */
export async function getPendingReviewApps(params: AppProductParam) {
  const res = await request.get<ApiResult<PageResult<AppProduct>>>(BASE + '/page', {
    params: { ...params, publishStatus: 'pending_review' },
  })
  if (res.data.code === 0) return res.data.data
  return Promise.reject(new Error(res.data.message))
}

/** 分页查询发布审核列表（别名） */
export const pagePublishReviews = getPendingReviewApps

/** 审核通过 */
export async function approve(id: number) {
  const res = await request.post<ApiResult<unknown>>(BASE + '/approve/' + id)
  if (res.data.code === 0) return res.data.message
  return Promise.reject(new Error(res.data.message))
}

/** 审核通过（别名） */
export const approvePublishReview = approve

/** 审核拒绝 */
export async function reject(id: number, reason: string) {
  const res = await request.post<ApiResult<unknown>>(BASE + '/reject/' + id, null, { params: { reason } })
  if (res.data.code === 0) return res.data.message
  return Promise.reject(new Error(res.data.message))
}

/** 审核拒绝（别名，接收对象参数） */
export async function rejectPublishReview(params: { productId: number; rejectReason: string }) {
  return reject(params.productId, params.rejectReason)
}

// ============ 其他 ============

/** 按用户ID列表批量统计应用数量 */
export interface UserAppStats {
  userId: number
  totalCount: number
  publishedCount: number
}

export async function getUserAppStats(userIds: number[]) {
  const res = await request.post<ApiResult<UserAppStats[]>>(BASE + '/user-stats', userIds)
  if (res.data.code === 0 && res.data.data) return res.data.data
  return []
}

/** 获取全部应用（下拉框用） */
export async function getAllAppProduct() {
  const res = await request.get<ApiResult<AppProduct[]>>(BASE + '/all')
  if (res.data.code === 0 && res.data.data) return res.data.data
  return Promise.reject(new Error(res.data.message))
}

/** 获取当前用户可访问的应用列表（带角色信息，用于权限过滤） */
export async function getMyAccessibleApps() {
  const res = await request.get<ApiResult<AppProduct[]>>(BASE + '/accessible')
  if ((res.data.code === 0 || res.data.code === 200) && res.data.data) return res.data.data
  return []
}

/** 更新访问量 */
export async function updateClicks(id: number) {
  const res = await request.post<ApiResult<unknown>>(BASE + '/view/' + id)
  if (res.data.code === 0) return res.data.message
  return Promise.reject(new Error(res.data.message))
}

/** 记录应用访问（更新最近访问时间） */
export async function recordVisit(id: number) {
  const res = await request.post<ApiResult<unknown>>(BASE + '/visit/' + id)
  // 静默失败，不影响主流程
  if (res.data.code !== 0) {
    console.warn('记录访问失败', res.data.message)
  }
}

/** 收藏/取消收藏 */
export async function toggleLike(id: number) {
  const res = await request.post<ApiResult<unknown>>(BASE + '/like/' + id)
  if (res.data.code === 0) return res.data.data
  return Promise.reject(new Error(res.data.message))
}

/** 重新生成密钥 */
export async function regenerateSecret(id: number) {
  const res = await request.post<ApiResult<unknown>>(BASE + '/regenerateSecret/' + id)
  if (res.data.code === 0) return res.data.data
  return Promise.reject(new Error(res.data.message))
}
