export interface PlatformLinkParams {
  platformClientId?: string | null;
  platformCancelUrl?: string | null;
  platformRescheduleUrl?: string | null;
  uid: string;
  bookerUrl: string;
  slug?: string;
  username?: string;
  teamId?: number;
  seatReferenceUid?: string;
  isRecurring?: boolean;
}

export interface CancelLinkParams extends PlatformLinkParams {
  cancelledBy?: string | null;
}

export interface RescheduleLinkParams extends PlatformLinkParams {
  rescheduledBy?: string | null;
  allowRescheduleForCancelledBooking?: boolean;
}

export function buildPlatformCancelLink({
  platformCancelUrl,
  uid,
  slug,
  username,
  isRecurring,
  seatReferenceUid,
  teamId,
}: {
  platformCancelUrl: string;
  uid: string | null | undefined;
  slug?: string | null;
  username?: string;
  isRecurring?: boolean;
  seatReferenceUid?: string;
  teamId?: number;
}): string {
  const platformCancelLink = new URL(`${platformCancelUrl}/${uid}`);

  if (slug) {
    platformCancelLink.searchParams.append("slug", slug);
  }
  if (username) {
    platformCancelLink.searchParams.append("username", username);
  }
  platformCancelLink.searchParams.append("cancel", "true");
  platformCancelLink.searchParams.append("allRemainingBookings", String(!!isRecurring));
  if (seatReferenceUid) {
    platformCancelLink.searchParams.append("seatReferenceUid", seatReferenceUid);
  }
  if (teamId) {
    platformCancelLink.searchParams.append("teamId", teamId.toString());
  }

  return platformCancelLink.toString();
}

/**
 * Builds a platform-specific reschedule link with all required query parameters.
 */
export function buildPlatformRescheduleLink({
  platformRescheduleUrl,
  uid,
  slug,
  username,
  seatReferenceUid,
  teamId,
}: {
  platformRescheduleUrl: string;
  uid: string | null | undefined;
  slug?: string | null;
  username?: string;
  seatReferenceUid?: string;
  teamId?: number;
}): string {
  const uidForReschedule = seatReferenceUid || uid;
  const platformRescheduleLink = new URL(`${platformRescheduleUrl}/${uidForReschedule}`);

  if (slug) {
    platformRescheduleLink.searchParams.append("slug", slug);
  }
  if (username) {
    platformRescheduleLink.searchParams.append("username", username);
  }
  platformRescheduleLink.searchParams.append("reschedule", "true");
  if (teamId) {
    platformRescheduleLink.searchParams.append("teamId", teamId.toString());
  }

  return platformRescheduleLink.toString();
}

/**
 * Builds a standard (non-platform) cancel link.
 */
export function buildStandardCancelLink({
  bookerUrl,
  uid,
  cancelledBy,
  seatReferenceUid,
  isRecurring,
}: {
  bookerUrl: string;
  uid: string | null | undefined;
  cancelledBy?: string | null;
  seatReferenceUid?: string;
  isRecurring?: boolean;
}): string {
  const cancelLink = new URL(`${bookerUrl}/booking/${uid}`);
  cancelLink.searchParams.append("cancel", "true");
  cancelLink.searchParams.append("allRemainingBookings", String(!!isRecurring));
  if (cancelledBy) {
    cancelLink.searchParams.append("cancelledBy", cancelledBy);
  }
  if (seatReferenceUid) {
    cancelLink.searchParams.append("seatReferenceUid", seatReferenceUid);
  }
  return cancelLink.toString();
}

/**
 * Builds a standard (non-platform) reschedule link.
 */
export function buildStandardRescheduleLink({
  bookerUrl,
  uid,
  rescheduledBy,
  seatReferenceUid,
  allowRescheduleForCancelledBooking,
}: {
  bookerUrl: string;
  uid: string | null | undefined;
  rescheduledBy?: string | null;
  seatReferenceUid?: string;
  allowRescheduleForCancelledBooking?: boolean;
}): string {
  const uidForReschedule = seatReferenceUid || uid;
  const url = new URL(`${bookerUrl}/reschedule/${uidForReschedule}`);

  if (allowRescheduleForCancelledBooking) {
    url.searchParams.append("allowRescheduleForCancelledBooking", "true");
  }
  if (rescheduledBy) {
    url.searchParams.append("rescheduledBy", rescheduledBy);
  }
  if (seatReferenceUid) {
    url.searchParams.append("seatReferenceUid", seatReferenceUid);
  }

  return url.toString();
}

/**
 * Builds a cancel link, using platform URL if available, otherwise standard URL.
 */
export function buildCancelLink(params: CancelLinkParams): string {
  const {
    platformClientId,
    platformCancelUrl,
    uid,
    bookerUrl,
    slug,
    username,
    teamId,
    seatReferenceUid,
    isRecurring,
    cancelledBy,
  } = params;

  if (platformClientId && platformCancelUrl) {
    return buildPlatformCancelLink({
      platformCancelUrl,
      uid,
      slug,
      username,
      isRecurring,
      seatReferenceUid,
      teamId,
    });
  }

  return buildStandardCancelLink({
    bookerUrl,
    uid,
    cancelledBy,
    seatReferenceUid,
    isRecurring,
  });
}

/**
 * Builds a reschedule link, using platform URL if available, otherwise standard URL.
 */
export function buildRescheduleLink(params: RescheduleLinkParams): string {
  const {
    platformClientId,
    platformRescheduleUrl,
    uid,
    bookerUrl,
    slug,
    username,
    teamId,
    seatReferenceUid,
    rescheduledBy,
    allowRescheduleForCancelledBooking,
  } = params;

  if (platformClientId && platformRescheduleUrl) {
    return buildPlatformRescheduleLink({
      platformRescheduleUrl,
      uid,
      slug,
      username,
      seatReferenceUid,
      teamId,
    });
  }

  return buildStandardRescheduleLink({
    bookerUrl,
    uid,
    rescheduledBy,
    seatReferenceUid,
    allowRescheduleForCancelledBooking,
  });
}
