import { formatInTimeZone } from "date-fns-tz";

export const CONFERENCE_TIMEZONE = "Asia/Manila";

export function sessionsOverlap(existingStart: Date, existingEnd: Date, selectedStart: Date, selectedEnd: Date): boolean {
  return existingStart < selectedEnd && selectedStart < existingEnd;
}

export function formatManilaDateTime(value: Date | string): string {
  return formatInTimeZone(new Date(value), CONFERENCE_TIMEZONE, "MMM d, yyyy h:mm a zzz");
}

export function csvSafe(value: string): string {
  return /^[=+\-@]/.test(value) ? `'${value}` : value;
}

export function makeRegistrationReference(randomPart = cryptoRandom()): string {
  return `PMAP63-26-${randomPart}`;
}

function cryptoRandom(): string {
  const alphabet = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
  let out = "";
  for (let i = 0; i < 6; i += 1) out += alphabet[Math.floor(Math.random() * alphabet.length)];
  return out;
}

export function calculateRate(input: { baseAmount: string | number; discount?: string | number; vatRate?: string | number; vatInclusive?: boolean }) {
  const base = Number(input.baseAmount);
  const discount = Number(input.discount ?? 0);
  const vatRate = Number(input.vatRate ?? 0);
  const taxable = Math.max(base - discount, 0);
  const vatAmount = input.vatInclusive ? taxable - taxable / (1 + vatRate) : taxable * vatRate;
  const totalAmount = input.vatInclusive ? taxable : taxable + vatAmount;
  return {
    baseAmount: base.toFixed(2),
    discount: discount.toFixed(2),
    vatAmount: vatAmount.toFixed(2),
    totalAmount: totalAmount.toFixed(2)
  };
}
