import { apiClient } from "./client";
import { getMeetingStatusApiFilter } from "@/lib/utils";
import {
  addMeetingSchema,
  type AddMeetingRequest,
  type AddMeetingResponse,
  type CreateScheduledMeetingRequest,
  type CreateScheduledMeetingResponse,
  type StartBotResponse,
  type StopRecordingResponse,
  type AbortMeetingResponse,
  type ListMeetingsApiResponse,
  type ListMeetingsParams,
  type InvitedMeetingsResponse,
  type RecurringCandidateDecisionRequest,
  type RecurringCandidateDecisionResponse,
} from "@/types/api";


export async function listMeetings(params: ListMeetingsParams = {}): Promise<ListMeetingsApiResponse> {
  const { page = 1, limit = 10, status, search, platform, type, time, sort_by } = params;
  const queryParams: Record<string, string> = {
    page: String(page),
    limit: String(limit),
  };
  // If status is "all" or not provided, we pass the combined status list to ensure scheduled/confirmation meetings are included.
  if (!status || status === "all") {
    queryParams.status = "bot.in_call_recording,bot.in_waiting_room,bot.in_call_not_recording,bot.joining_call,transcript.processing,recording.done,pending,live,processing,failed,bot.fatal,abort,not_admitted,too_short,recording.failed,transcript.failed,completed,bot.done,bot.call_ended,transcript.done,scheduled,recurring.waiting_for_app_confirmation";
  } else {
    queryParams.status = status.includes(",") ? status : getMeetingStatusApiFilter(status);
  }
  if (search !== undefined && search !== "") {
    queryParams.search = search;
  }
  if (platform !== undefined && platform !== "all") {
    queryParams.platform = platform;
  }
  if (type !== undefined && type !== "all") {
    queryParams.type = type;
  }
  if (time !== undefined && time !== "all") {
    queryParams.time = time;
  }
  if (sort_by !== undefined && sort_by !== "all") {
    queryParams.sort_by = sort_by;
  }
  return apiClient.get<ListMeetingsApiResponse>("/list-meetings", { params: queryParams });
}

export async function addMeeting(payload: AddMeetingRequest): Promise<AddMeetingResponse> {
  const validated = addMeetingSchema.parse(payload);
  return apiClient.post<AddMeetingResponse>("/add-meeting", validated);
}

export async function createScheduledMeeting(
  payload: CreateScheduledMeetingRequest
): Promise<CreateScheduledMeetingResponse> {
  return apiClient.post<CreateScheduledMeetingResponse>("/create-scheduled-meeting", payload);
}

export async function startBot(meetingId: number): Promise<StartBotResponse> {
  return apiClient.post<StartBotResponse>(`/start-bot/${meetingId}`);
}

export async function stopRecording(meetingId: number): Promise<StopRecordingResponse> {
  return apiClient.post<StopRecordingResponse>(`/stop-recording/${meetingId}`);
}

// POST /meeting/abort/{meeting_id}
export async function abortMeeting(meetingId: number): Promise<AbortMeetingResponse> {
  return apiClient.post<AbortMeetingResponse>(`/meeting/abort/${meetingId}`);
}

// GET /invited-meetings
export async function listInvitedMeetings(params: ListMeetingsParams = {}): Promise<InvitedMeetingsResponse> {
  const { page = 1, limit = 12, status, search, platform, type, time, sort_by } = params;
  const queryParams: Record<string, string> = {
    page: String(page),
    limit: String(limit),
  };
  // If status is "all" or not provided, we pass the combined status list to ensure scheduled/confirmation meetings are included.
  if (!status || status === "all") {
    queryParams.status = "bot.in_call_recording,bot.in_waiting_room,bot.in_call_not_recording,bot.joining_call,transcript.processing,recording.done,pending,live,processing,failed,bot.fatal,abort,not_admitted,too_short,recording.failed,transcript.failed,completed,bot.done,bot.call_ended,transcript.done,scheduled,recurring.waiting_for_app_confirmation";
  } else {
    queryParams.status = status.includes(",") ? status : getMeetingStatusApiFilter(status);
  }
  if (search !== undefined && search !== "") {
    queryParams.search = search;
  }
  if (platform !== undefined && platform !== "all") {
    queryParams.platform = platform;
  }
  if (type !== undefined && type !== "all") {
    queryParams.type = type;
  }
  if (time !== undefined && time !== "all") {
    queryParams.time = time;
  }
  if (sort_by !== undefined && sort_by !== "all") {
    queryParams.sort_by = sort_by;
  }
  return apiClient.get<InvitedMeetingsResponse>("/invited-meetings", { params: queryParams });
}

// POST /recurring-candidates/{recurringCandidateId}/decision
export async function setRecurringCandidateDecision(
  recurringCandidateId: number,
  payload: RecurringCandidateDecisionRequest
): Promise<RecurringCandidateDecisionResponse> {
  return apiClient.post<RecurringCandidateDecisionResponse>(
    `/recurring-candidates/${recurringCandidateId}/decision`,
    payload
  );
}

