import { convertGregorianToBangla, BanglaDate, BANGLA_MONTHS, BANGLA_SEASONS, BANGLA_WEEKDAYS } from "./banglaCalendar"

// Re-export the constants
export { BANGLA_MONTHS, BANGLA_SEASONS, BANGLA_WEEKDAYS, BanglaDate }

// Define format options
export type BanglaDateFormat = "full" | "medium" | "short" | "custom"

// Helper to convert a number to Bangla numerals
const banglaNumerals = ["০", "১", "২", "৩", "৪", "৫", "৬", "৭", "৮", "৯"]

export const toBanglaNumerals = (num: number): string => {
  return num
    .toString()
    .split("")
    .map((digit) => banglaNumerals[Number.parseInt(digit)] || digit)
    .join("")
}

// Gregorian month names in Bangla
const GREGORIAN_MONTHS_IN_BANGLA = [
  "জানুয়ারি",
  "ফেব্রুয়ারি",
  "মার্চ",
  "এপ্রিল",
  "মে",
  "জুন",
  "জুলাই",
  "আগস্ট",
  "সেপ্টেম্বর",
  "অক্টোবর",
  "নভেম্বর",
  "ডিসেম্বর",
]

/**
 * Format a Gregorian date in Bangla language
 * @param dateString Date string (e.g., "2023-05-14" or "2023-05-14T10:30:00Z")
 * @param format Format option for the output
 * @returns Formatted Gregorian date in Bangla language
 */
export const formatGregorianToBangla = (dateString: string, format: BanglaDateFormat = "medium"): string => {
  // Parse the date string
  const date = new Date(dateString)

  // Check if the date is valid
  if (isNaN(date.getTime())) {
    throw new Error(`Invalid date string: ${dateString}`)
  }

  const day = date.getDate()
  const month = date.getMonth() // 0-11
  const year = date.getFullYear()

  // Convert to Bangla numerals
  const banglaDay = toBanglaNumerals(day)
  const banglaYear = toBanglaNumerals(year)
  const banglaMonthName = GREGORIAN_MONTHS_IN_BANGLA[month]

  // Format based on the requested format
  if (format === "full") {
    const weekday = getBanglaWeekday(date)
    return `${weekday}, ${banglaDay} ${banglaMonthName}, ${banglaYear}`
  } else if (format === "short") {
    return `${banglaDay}/${toBanglaNumerals(month + 1)}/${banglaYear}`
  } else {
    // medium format (default)
    return `${banglaDay} ${banglaMonthName}, ${banglaYear}`
  }
}

/**
 * Format a Bangla date as a string
 * @param banglaDate BanglaDate object
 * @param format Format string (e.g., 'full', 'medium', 'short')
 * @returns Formatted Bangla date string
 */
const formatBanglaDateString = (
  banglaDate: BanglaDate,
  format: BanglaDateFormat = "medium",
  customFormat?: string,
): string => {
  const { date, month, year, monthName, season } = banglaDate

  const banglaDateNum = toBanglaNumerals(date)
  const banglaYear = toBanglaNumerals(year)

  if (format === "full") {
    return `${banglaDateNum} ${monthName} ${banglaYear} (${season})`
  } else if (format === "short") {
    return `${banglaDateNum}/${toBanglaNumerals(month)}/${banglaYear}`
  } else if (format === "custom" && customFormat) {
    // Handle custom format (placeholder for future implementation)
    // For now, return medium format
    return `${banglaDateNum} ${monthName} ${banglaYear}`
  } else {
    // medium format
    return `${banglaDateNum} ${monthName} ${banglaYear}`
  }
}

/**
 * Convert a date string to a Bangla calendar date string
 * @param dateString Date string (e.g., "2023-05-14" or "2023-05-14T10:30:00Z")
 * @param format Format option for the output
 * @param customFormat Custom format string (for future implementation)
 * @returns Formatted Bangla calendar date string
 */
export const convertToBanglaDate = (
  dateString: string,
  format: BanglaDateFormat = "medium",
  customFormat?: string,
): string => {
  // Parse the date string
  const date = new Date(dateString)

  // Check if the date is valid
  if (isNaN(date.getTime())) {
    throw new Error(`Invalid date string: ${dateString}`)
  }

  // Convert to Bangla date
  const banglaDate = convertGregorianToBangla(date)

  // Format and return
  return formatBanglaDateString(banglaDate, format, customFormat)
}

/**
 * Get detailed Bangla calendar information from a date string
 * @param dateString Date string (e.g., "2023-05-14" or "2023-05-14T10:30:00Z")
 * @param format Format option for the formatted output
 * @param customFormat Custom format string (for future implementation)
 * @returns Object containing formatted string and Bangla date details
 */
export const getBanglaDateDetails = (
  dateString: string,
  format: BanglaDateFormat = "medium",
  customFormat?: string,
): { formatted: string; details: BanglaDate } => {
  // Parse the date string
  const date = new Date(dateString)

  // Check if the date is valid
  if (isNaN(date.getTime())) {
    throw new Error(`Invalid date string: ${dateString}`)
  }

  // Convert to Bangla date
  const banglaDate = convertGregorianToBangla(date)

  // Format the date
  const formatted = formatBanglaDateString(banglaDate, format, customFormat)

  // Return both the formatted string and the details
  return {
    formatted,
    details: banglaDate,
  }
}

/**
 * Get the Bangla weekday name for a given date
 * @param date JavaScript Date object
 * @returns Bangla weekday name
 */
const getBanglaWeekday = (date: Date): string => {
  const day = date.getDay()
  return BANGLA_WEEKDAYS[day]
}
