import { api } from "@/lib/api"
import type { Appointment, GetAppointmentsParams, AppointmentsArrayResponse, StylistAppointmentsResponse, GetStylistAppointmentsParams, CancelledAppointment } from "@/types/appointments"

export const getAppointments = ["appointments", "list"]
export const getAppointmentById = (id: string) => ["appointments", "detail", id]
export const modifyAppointment = ["appointments", "modify"]
export const getStylistAppointments = (stylistId: string) => ["appointments", "stylist", stylistId]
export const getCancelledVacationAppointments = (stylistId: string) => ["appointments", "cancelled-vacation", stylistId]

export interface ModifyAppointmentPayload {
  bookingId: string
  date?: string
  time?: string
  delete?: boolean
}

export async function fetchAppointments(params: GetAppointmentsParams = {}): Promise<AppointmentsArrayResponse> {
  const queryParams = new URLSearchParams()

  if (params.range) queryParams.append("range", params.range)
  if (params.date) queryParams.append("date", params.date)
  if (params.stylistId) queryParams.append("stylistId", params.stylistId)

  const queryString = queryParams.toString()
  const url = `/appointments/stylist${queryString ? `?${queryString}` : ""}`

  const { data } = await api.get<AppointmentsArrayResponse>(url)
  return data
}

export async function fetchAppointmentById(id: string): Promise<Appointment> {
  const { data } = await api.get<Appointment>(`/appointments/${id}`)
  return data
}

export async function modifyAppointmentDetails(payload: ModifyAppointmentPayload) {
  const { data } = await api.patch("/appointments/modify", payload)
  return data
}

export async function fetchStylistAppointments(params: GetStylistAppointmentsParams): Promise<StylistAppointmentsResponse> {
  const queryParams = new URLSearchParams()

  queryParams.append("stylistId", params.stylistId)
  if (params.page) queryParams.append("page", params.page.toString())
  if (params.limit) queryParams.append("limit", params.limit.toString())

  const { data } = await api.get<StylistAppointmentsResponse>(`/appointments/stylist/appointments?${queryParams.toString()}`)
  return data
}

export async function markAsNoShow(id: string) {
  const { data } = await api.patch(`/appointments/no-show/${id}`)
  return data
}

export async function fetchCancelledVacationAppointments(stylistId: string): Promise<CancelledAppointment[]> {
  const { data } = await api.get<CancelledAppointment[]>(`/appointments/cancelled/appointments?stylistId=${stylistId}`)
  return data
}
