import {
  Breadcrumbs as BaseBreadcrumbs,
  BreadcrumbItem,
  BreadcrumbsProps,
} from "@nextui-org/react";
import { usePathname } from "next/navigation";
import { FaChevronRight } from "react-icons/fa6";
import { FaHome } from "react-icons/fa";

function capitalizeFirstLetter(string: string) {
  return string.charAt(0).toUpperCase() + string.slice(1);
}

function formatBreadcrumbLabel(label: string) {
  const words = label.split("-");

  words[0] = capitalizeFirstLetter(words[0]);

  const contractions: { [key: string]: string } = {
    dont: "don't",
    wont: "won't",
    cant: "can't",
    isnt: "isn't",
    doesnt: "doesn't",
    wasnt: "wasn't",
    werent: "weren't",
    shouldnt: "shouldn't",
    couldnt: "couldn't",
    wouldnt: "wouldn't",
    arent: "aren't",
    hasnt: "hasn't",
    havent: "haven't",
    hadnt: "hadn't",
    theres: "there's",
  };

  const keywordsToCapitalize = [
    "pfr",
    "uk",
    "nhs",
    "bhf",
    "nct",
    "ux",
    "bfi",
    "mrs",
    "frank",
    "nct",
    "dit",
    "ons",
    "b2b",
    "gdpr",
  ];

  return words
    .map((word) => {
      const lowerCaseWord = word.toLowerCase();

      if (contractions[lowerCaseWord]) {
        return contractions[lowerCaseWord];
      }

      for (const keyword of keywordsToCapitalize) {
        if (lowerCaseWord.startsWith(keyword)) {
          const remainingPart = word.slice(keyword.length);
          return keyword.toUpperCase() + remainingPart;
        }
      }

      return word;
    })
    .join(" ");
}

function Breadcrumbs({
  color,
  size,
  underline,
  separator = <FaChevronRight className="size-3" />,
  maxItems = 5,
  itemsAfterCollapse = 2,
  itemsBeforeCollapse = 1,
  variant = "light",
  classNames = {
    base: "text-sm font-inter font-semibold py-2",
    list: "",
    ellipsis: "",
    separator: "px-2",
  },
}: BreadcrumbsProps) {
  const asPath = usePathname();
  const pathSegments = asPath.split("/").filter(Boolean);

  let breadcrumbSegments: string[];

  if (
    pathSegments.length >= 2 &&
    pathSegments[0] === "participant" &&
    pathSegments[1] === "campaign"
  ) {
    breadcrumbSegments = pathSegments.slice(0, 2);
  } else {
    breadcrumbSegments = pathSegments;
  }

  const breadcrumbs = [
    { label: "Home", link: "/" },
    ...breadcrumbSegments.map((segment, index) => {
      const path = `/${pathSegments.slice(0, index + 1).join("/")}`;
      return { label: formatBreadcrumbLabel(segment), link: path };
    }),
  ];

  return (
    <BaseBreadcrumbs
      as="ol"
      classNames={classNames}
      color={color}
      itemsAfterCollapse={itemsAfterCollapse}
      itemsBeforeCollapse={itemsBeforeCollapse}
      maxItems={maxItems}
      separator={separator}
      size={size}
      underline={underline}
      variant={variant}
    >
      {breadcrumbs.map(({ label, link }, index) => (
        <BreadcrumbItem
          key={link}
          aria-current={index === breadcrumbs.length - 1 ? "page" : undefined}
          as="li"
          href={link}
        >
          {index === 0 ? (
            <>
              <FaHome aria-hidden className="size-4 inline-block" />
              <span className="sr-only">{label}</span>
            </>
          ) : (
            <span className="inline-block max-w-36 xl:max-w-96 overflow-hidden overflow-ellipsis whitespace-nowrap">
              {label}
            </span>
          )}
        </BreadcrumbItem>
      ))}
    </BaseBreadcrumbs>
  );
}

export default Breadcrumbs;
