// Base
import type { CheckInFormData } from '~/schemas/encounter.schema'
import * as base from './_crud-base'

// Constants
import { encounterClassCodes } from '~/lib/constants'

const path = '/api/v1/encounter'
const name = 'encounter'

export function create(data: any) {
  return base.create(path, data, name)
}

export function getList(params: any = null) {
  return base.getList(path, params, name)
}

export function getDetail(id: number | string, params?: any) {
  return base.getDetail(path, id, name, params)
}

export function update(id: number | string, data: any) {
  return base.update(path, id, data, name)
}

export function remove(id: number | string) {
  return base.remove(path, id, name)
}

export function cancel(id: number | string) {
  let url = `${path}/${id}/cancel`
  return base.updateCustom(url, null, name)
}

export async function getValueLabelList(params: any = null): Promise<{ value: string; label: string }[]> {
  let data: { value: string; label: string }[] = []
  const result = await getList(params)
  if (result.success) {
    const resultData = result.body?.data || []
    data = resultData.map((item: any) => ({
      value: item.id ? Number(item.id) : item.code,
      label: item.name,
    }))
  }
  return data
}

export function getValueLabelListConstants() {
  const allowed = ['ambulatory', 'emergency', 'inpatient']
  return Object.entries(encounterClassCodes)
    .filter(([key]) => allowed.includes(key))
    .map(([key, value]) => ({ value: key, label: value }))
}

export async function checkIn(id: number, data: CheckInFormData) {
  try {
    const resp = await xfetch(`${path}/${id}/check-in`, 'PATCH', data)
    const result: any = {}
    result.success = resp.success
    result.body = (resp.body as Record<string, any>) || {}
    return result
  } catch (error) {
    console.error(`Error putting ${name}:`, error)
    throw new Error(`Failed to put ${name}`)
  }
}