import { xfetch } from '~/composables/useXfetch'
import { uploadCode, type UploadCodeKey } from '~/lib/constants'

const mainUrl = '/api/v1/patient'

export async function getPatients(params: any = null) {
  try {
    let url = mainUrl
    if (params && typeof params === 'object' && Object.keys(params).length > 0) {
      const searchParams = new URLSearchParams()
      for (const key in params) {
        if (params[key] !== null && params[key] !== undefined && params[key] !== '') {
          searchParams.append(key, params[key])
        }
      }
      const queryString = searchParams.toString()
      if (queryString) url += `?${queryString}`
    }
    const resp = await xfetch(url, 'GET')
    const result: any = {}
    result.success = resp.success
    result.body = (resp.body as Record<string, any>) || {}
    return result
  } catch (error) {
    console.error('Error fetching patients:', error)
    throw new Error('Failed to fetch patients')
  }
}

export async function getPatientDetail(id: number) {
  try {
    const resp = await xfetch(`${mainUrl}/${id}`, 'GET')
    const result: any = {}
    result.success = resp.success
    result.body = (resp.body as Record<string, any>) || {}
    return result
  } catch (error) {
    console.error('Error fetching patient detail:', error)
    throw new Error('Failed to get patient detail')
  }
}

export async function postPatient(record: any) {
  try {
    const resp = await xfetch(mainUrl, 'POST', record)
    const result: any = {}
    result.success = resp.success
    result.body = (resp.body as Record<string, any>) || {}
    return result
  } catch (error) {
    console.error('Error posting patient:', error)
    throw new Error('Failed to post patient')
  }
}

export async function patchPatient(id: number, record: any) {
  try {
    const resp = await xfetch(`${mainUrl}/${id}`, 'PATCH', record)
    const result: any = {}
    result.success = resp.success
    result.body = (resp.body as Record<string, any>) || {}
    return result
  } catch (error) {
    console.error('Error patching patient:', error)
    throw new Error('Failed to patch patient')
  }
}

export async function removePatient(id: number) {
  try {
    const resp = await xfetch(`${mainUrl}/${id}`, 'DELETE')
    const result: any = {}
    result.success = resp.success
    result.body = (resp.body as Record<string, any>) || {}
    return result
  } catch (error) {
    console.error('Error deleting record:', error)
    throw new Error('Failed to delete patient')
  }
}

export async function uploadAttachment(file: File, userId: number, key: UploadCodeKey) {
  try {
    const resolvedKey = uploadCode[key]
    if (!resolvedKey) {
      throw new Error(`Invalid upload code key: ${key}`)
    }

    // siapkan form-data body
    const formData = new FormData()
    formData.append('code', resolvedKey)
    formData.append('content', file)

    // kirim via xfetch
    const resp = await xfetch(`${mainUrl}/${userId}/upload`, 'POST', formData)

    // struktur hasil sama seperti patchPatient
    const result: any = {}
    result.success = resp.success
    result.body = (resp.body as Record<string, any>) || {}

    return result
  } catch (error) {
    console.error('Error uploading attachment:', error)
    throw new Error('Failed to upload attachment')
  }
}
