"use client";

import type { ComponentType, SVGProps } from "react";
import {
  BudgetIcon,
  ChecklistIcon,
  EventDatesIcon,
  ExpenseTrackerIcon,
  GiftIcon,
  GuestListIcon,
  LocationIcon,
  NotesIcon,
  PaymentsIcon,
  PeopleIcon,
  ShoppingListIcon,
  TimelineIcon,
  TodoIcon,
  VendorsIcon,
} from "@/components/icons/modules/module-icons";

export type ModuleIconName =
  | "Calendar"
  | "MapPin"
  | "CheckSquare"
  | "Users"
  | "User"
  | "Receipt"
  | "Wallet"
  | "Briefcase"
  | "Clock"
  | "FileText"
  | "ListChecks"
  | "CreditCard"
  | "ShoppingBag"
  | "Gift";

const ICONS_BY_NAME: Record<ModuleIconName, ComponentType<SVGProps<SVGSVGElement>>> = {
  Calendar: EventDatesIcon,
  MapPin: LocationIcon,
  CheckSquare: TodoIcon,
  Users: GuestListIcon,
  User: PeopleIcon,
  Receipt: ExpenseTrackerIcon,
  Wallet: BudgetIcon,
  Briefcase: VendorsIcon,
  Clock: TimelineIcon,
  FileText: NotesIcon,
  ListChecks: ChecklistIcon,
  CreditCard: PaymentsIcon,
  ShoppingBag: ShoppingListIcon,
  Gift: GiftIcon,
};

export interface ModuleIconProps extends Omit<SVGProps<SVGSVGElement>, "name"> {
  name?: string | null;
  small?: boolean;
}

export function ModuleIcon({ name, small, className, ...rest }: ModuleIconProps) {
  const Component: ComponentType<SVGProps<SVGSVGElement>> =
    (name &&
      (ICONS_BY_NAME as Record<string, ComponentType<SVGProps<SVGSVGElement>>>)[name]) ||
    EventDatesIcon;
  const sizeClass = small ? "h-4 w-4" : "h-5 w-5";
  return (
    <Component
      aria-hidden
      className={`${sizeClass} ${className ?? ""}`.trim()}
      {...rest}
    />
  );
}
