import type {
  CabinetOnlineStatus,
  CabinetPayload,
  CabinetStatus,
  CabinetTestStatus,
  DeviceCabinetRecord,
} from '@/stores/deviceCabinets'
import { request, type ApiResponse } from './request'

export interface DeviceCabinetListParams {
  pageNum: number
  pageSize: number
  device?: string
  beginCreateTime?: string
  endCreateTime?: string
  onlineStatus?: string
  testStatus?: string
  status?: string
}

interface DetectionCabinetDto {
  cabinetId: number
  cabinetCode: string | null
  cabinetName: string | null
  ipAddress: string | null
  macAddress: string | null
  manufacturer: string | null
  model: string | null
  capacity: number | string | null
  channelCount: number | null
  onlineStatus: string | null
  testStatus: string | null
  currentTest: string | null
  status: string | null
  remark: string | null
  createTime: string | null
}

interface DetectionCabinetListResponse extends ApiResponse {
  total: number
  rows: DetectionCabinetDto[]
}

interface DetectionCabinetDetailResponse extends ApiResponse {
  data: DetectionCabinetDto
}

interface DetectionCabinetPayload {
  cabinetId?: number
  cabinetCode: string
  cabinetName: string
  ipAddress: string
  macAddress: string
  manufacturer: string
  model: string
  capacity: number
  channelCount: number
  onlineStatus: string
  testStatus: string
  currentTest: string
  status: string
  remark: string
}

export interface DeviceCabinetListResult {
  total: number
  rows: DeviceCabinetRecord[]
}

export interface DiscoveredCabinet {
  deviceCode: string
  ip: string
  mac: string
  onlineStatus: CabinetOnlineStatus
  testStatus: CabinetTestStatus
  currentTest: string
}

export interface DiscoveredCabinetListResult {
  total: number
  rows: DiscoveredCabinet[]
}

interface DiscoveredCabinetListResponse extends ApiResponse {
  total: number
  rows: DiscoveredCabinet[]
}

const onlineStatusMap: Record<string, CabinetOnlineStatus> = { '0': '在线', '1': '离线' }
const testStatusMap: Record<string, CabinetTestStatus> = { '0': '空闲', '1': '测试中' }
const statusMap: Record<string, CabinetStatus> = { '0': '启用', '1': '禁用' }

function mapCabinet(item: DetectionCabinetDto): DeviceCabinetRecord {
  return {
    id: item.cabinetId,
    deviceCode: item.cabinetCode || '-',
    ip: item.ipAddress || '-',
    mac: item.macAddress || '-',
    name: item.cabinetName || '-',
    manufacturer: item.manufacturer || '-',
    model: item.model || '-',
    channelCount: item.channelCount ?? 0,
    specs: Number(item.capacity) || 0,
    remark: item.remark || '',
    onlineStatus: onlineStatusMap[item.onlineStatus || ''] || '离线',
    testStatus: testStatusMap[item.testStatus || ''] || '空闲',
    currentTest: item.currentTest || '',
    status: statusMap[item.status || ''] || '禁用',
    createdAt: item.createTime || '',
  }
}

function mapPayload(payload: CabinetPayload, cabinetId?: number): DetectionCabinetPayload {
  return {
    ...(cabinetId === undefined ? {} : { cabinetId }),
    cabinetCode: payload.deviceCode,
    cabinetName: payload.name,
    ipAddress: payload.ip,
    macAddress: payload.mac,
    manufacturer: payload.manufacturer,
    model: payload.model,
    capacity: payload.specs,
    channelCount: payload.channelCount,
    onlineStatus: payload.onlineStatus === '在线' ? '0' : '1',
    testStatus: payload.testStatus === '测试中' ? '1' : '0',
    currentTest: payload.currentTest,
    status: payload.status === '启用' ? '0' : '1',
    remark: payload.remark,
  }
}

export async function getDeviceCabinetList(params: DeviceCabinetListParams): Promise<DeviceCabinetListResult> {
  const searchParams = new URLSearchParams()
  Object.entries(params).forEach(([key, value]) => {
    if (value !== undefined && value !== '') searchParams.set(key, String(value))
  })

  const result = await request<DetectionCabinetListResponse>(`/system/detectionCabinet/list?${searchParams.toString()}`)
  return {
    total: Number(result.total) || 0,
    rows: (result.rows || []).map(mapCabinet),
  }
}

export async function getDiscoveredCabinetList(pageNum: number, pageSize: number): Promise<DiscoveredCabinetListResult> {
  const result = await request<DiscoveredCabinetListResponse>(
    `/system/detectionCabinet/discovered/list?pageNum=${pageNum}&pageSize=${pageSize}`,
  )
  return {
    total: Number(result.total) || 0,
    rows: result.rows || [],
  }
}

export async function getDeviceCabinetDetail(cabinetId: number): Promise<DeviceCabinetRecord> {
  const result = await request<DetectionCabinetDetailResponse>(`/system/detectionCabinet/${cabinetId}`)
  return mapCabinet(result.data)
}

export async function createDeviceCabinet(payload: CabinetPayload): Promise<void> {
  await request<ApiResponse>('/system/detectionCabinet', {
    method: 'POST',
    body: JSON.stringify(mapPayload(payload)),
  })
}

export async function updateDeviceCabinet(cabinetId: number, payload: CabinetPayload): Promise<void> {
  await request<ApiResponse>('/system/detectionCabinet', {
    method: 'PUT',
    body: JSON.stringify(mapPayload(payload, cabinetId)),
  })
}

export async function changeDeviceCabinetStatus(cabinetId: number, status: CabinetStatus): Promise<void> {
  await request<ApiResponse>('/system/detectionCabinet/changeStatus', {
    method: 'PUT',
    body: JSON.stringify({
      cabinetId,
      status: status === '启用' ? '0' : '1',
    }),
  })
}

export async function deleteDeviceCabinets(cabinetIds: number | number[]): Promise<void> {
  const ids = Array.isArray(cabinetIds) ? cabinetIds : [cabinetIds]
  await request<ApiResponse>(`/system/detectionCabinet/${ids.join(',')}`, {
    method: 'DELETE',
  })
}
