import { createCoreAPIClient } from "../coreClient";
import type { CoreAPIPagination } from "../types";
import type { CoreBooking, CoreBookingUnit, CoreResponse } from "./types";

const coreClient = createCoreAPIClient();

import { getSessionOptions } from "@/lib/cookies";

export async function searchBookings(
  page = 1,
  pageSize = 50,
  type: string,
  request?: Request,
) {
  const params = new URLSearchParams();
  params.set("page", page.toString());
  params.set("pageSize", pageSize.toString());
  params.set("type", type);

  try {
    const options = getSessionOptions(request);
    const response = await coreClient<{
      bookings: CoreBookingUnit[];
      pagination: CoreAPIPagination;
    }>(`/v1/admin/bookings?${params.toString()}`, {
      headers: { ...options } as HeadersInit,
    });
    return response;
  } catch (error) {
    return {
      message: (error as Error).message ?? "Failed fetching bookings",
      data: null,
      success: false,
    };
  }
}

export async function getBookingById(bookingId: string, request?: Request) {
  try {
    const options = getSessionOptions(request);
    const response = await coreClient<{ booking: CoreBooking }>(
      `/v1/admin/bookings/${bookingId}`,
      {
        headers: { ...options } as HeadersInit,
      },
    );
    return response;
  } catch (error) {
    return {
      message: (error as Error).message ?? "Failed fetching booking",
      data: null,
      success: false,
    };
  }
}

export async function getBookingsByMembership(
  page = 1,
  pageSize = 50,
  membershipNumber: string,
  request?: Request,
  entityType?: "internal" | "external",
) {
  const params = new URLSearchParams();
  params.set("page", page.toString());
  params.set("pageSize", pageSize.toString());
  if (entityType) {
    params.set("entityType", entityType);
  }
  try {
    const options = getSessionOptions(request);
    const response = await coreClient<{
      bookings: CoreBookingUnit[];
      pagination: CoreAPIPagination;
    }>(
      `/v1/admin-console/members/bookings/${membershipNumber}?${params.toString()}`,
      {
        headers: { ...options } as HeadersInit,
      },
    );
    return response;
  } catch (error) {
    return {
      message: (error as Error).message ?? "Failed fetching bookings",
      data: null,
      success: false,
    };
  }
}

export async function sendRCIUnitEDM(unitId: string, memberRecordID: number) {
  try {
    const response = await coreClient<CoreResponse>(
      `/v1/admin-console/bookings/externals/rci/units/${unitId}`,
      {
        method: "POST",
        body: JSON.stringify({ memberRecordID: String(memberRecordID) }),
      },
    );
    return response;
  } catch (error) {
    return {
      success: false,
      message: (error as Error)?.message ?? "Failed to send EDM",
      data: null,
    };
  }
}
