/**
 * Date formatting utilities
 * Provides PDA-friendly date formatting and grouping
 */

import { format, differenceInDays, isBefore, isSameDay, addDays } from "date-fns";

/**
 * Format a date in a readable format
 */
export function formatDate(date: Date): string {
  try {
    return format(date, "MMM d, yyyy");
  } catch {
    return "Invalid Date";
  }
}

/**
 * Format time in 12-hour format
 */
export function formatTime(date: Date): string {
  try {
    return format(date, "h:mm a");
  } catch {
    return "Invalid Time";
  }
}

/**
 * Get a PDA-friendly label for date grouping
 * Returns: "Today", "Tomorrow", "This Week", "Next Week", "Later"
 */
export function getDateGroupLabel(date: Date, referenceDate: Date = new Date()): string {
  if (isSameDay(date, referenceDate)) {
    return "Today";
  }

  const tomorrow = addDays(referenceDate, 1);
  if (isSameDay(date, tomorrow)) {
    return "Tomorrow";
  }

  const daysUntil = differenceInDays(date, referenceDate);

  if (daysUntil >= 0 && daysUntil <= 7) {
    return "This Week";
  }

  if (daysUntil > 7 && daysUntil <= 14) {
    return "Next Week";
  }

  return "Later";
}

/**
 * Check if a date has passed (PDA-friendly: "target passed" instead of "overdue")
 */
export function isPastTarget(targetDate: Date, now: Date = new Date()): boolean {
  return isBefore(targetDate, now);
}

/**
 * Check if a date is approaching (within 24 hours)
 */
export function isApproachingTarget(targetDate: Date, now: Date = new Date()): boolean {
  const hoursUntil = differenceInDays(targetDate, now);
  return hoursUntil >= 0 && hoursUntil <= 1;
}
