import { baseAPI } from "@/lib/api";

import type {
  CreatePlenaryPayload,
  PlenaryDetailResponse,
  PlenaryListResponse,
  PlenaryMinistryApi,
  UpdatePlenaryPayload,
} from "../plenary-data";

type MinistriesLookupResponse = {
  data?: { items?: PlenaryMinistryApi[] };
  items?: PlenaryMinistryApi[];
};

export async function getPlenaries(
  page = 1,
  limit = 10,
  filters?: Record<string, unknown>,
) {
  const query = new URLSearchParams({
    page: String(page),
    limit: String(limit),
  });

  if (filters) {
    for (const [key, value] of Object.entries(filters)) {
      if (
        value === undefined ||
        value === null ||
        value === "" ||
        value === false
      )
        continue;
      if (Array.isArray(value))
        value.forEach((item) => query.append(key, String(item)));
      else query.set(key, String(value));
    }
  }

  const response = (await baseAPI(`/plenaries?${query}`, {
    cache: "no-store",
  })) as PlenaryListResponse;

  return response.data;
}

export async function getPlenaryDetail(id: number) {
  const response = (await baseAPI(`/plenaries/${id}`, {
    cache: "no-store",
  })) as PlenaryDetailResponse;

  return response.data;
}

export async function getActiveMinistries(relatedStakeholderId?: number) {
  const query = new URLSearchParams();

  if (relatedStakeholderId) {
    query.set("relatedStakeholderId", String(relatedStakeholderId));
  }

  const response = (await baseAPI(
    `/plenaries/lookups/ministries${query.toString() ? `?${query}` : ""}`,
    {
      cache: "no-store",
    },
  )) as MinistriesLookupResponse;

  return response.data?.items ?? response.items ?? [];
}

export async function createPlenary(payload: CreatePlenaryPayload) {
  const response = (await baseAPI("/plenaries", {
    method: "POST",
    body: JSON.stringify(payload),
  })) as PlenaryDetailResponse;

  return response.data;
}

export async function updatePlenary(id: number, payload: UpdatePlenaryPayload) {
  const response = (await baseAPI(`/plenaries/${id}`, {
    method: "PATCH",
    body: JSON.stringify(payload),
  })) as PlenaryDetailResponse;

  return response.data;
}

export async function uploadPlenaryDocument(id: number, file: File) {
  const formData = new FormData();
  formData.append("file", file);

  const response = (await baseAPI(`/plenaries/${id}/document`, {
    method: "PATCH",
    body: formData,
  })) as PlenaryDetailResponse;

  return response.data;
}

export async function deletePlenary(id: number) {
  const response = (await baseAPI(`/plenaries/${id}`, {
    method: "DELETE",
  })) as PlenaryDetailResponse;

  return response.data;
}
