import type { useTranslate } from "../../../hooks/i18n";

import type { IResourceItem } from "../../../contexts/resource/types";
import { safeTranslate } from "../safe-translate";
import { useUserFriendlyName } from "../useUserFriendlyName";

/**
 * Generates document title for the given resource and action.
 */
export function generateDefaultDocumentTitle(
  translate: ReturnType<typeof useTranslate>,
  resource?: IResourceItem,
  action?: string,
  id?: string,
  resourceName?: string,
  getUserFriendlyName?: (name: string, type: "singular" | "plural") => string,
) {
  const getFriendlyName = getUserFriendlyName || useUserFriendlyName();

  const actionPrefixMatcher = {
    create: "Create new ",
    clone: `#${id ?? ""} Clone `,
    edit: `#${id ?? ""} Edit `,
    show: `#${id ?? ""} Show `,
    list: "",
  };

  const identifier = resource?.identifier ?? resource?.name;

  const resourceNameFallback =
    resource?.meta?.label ??
    (identifier
      ? getFriendlyName(identifier, action === "list" ? "plural" : "singular")
      : identifier);

  const resourceNameWithFallback = resourceName ?? resourceNameFallback;

  const defaultTitle = safeTranslate(
    translate,
    "documentTitle.default",
    "Refine",
  );
  const suffix = safeTranslate(translate, "documentTitle.suffix", " | Refine");
  let autoGeneratedTitle = defaultTitle;

  if (action && identifier) {
    autoGeneratedTitle = safeTranslate(
      translate,
      `documentTitle.${identifier}.${action}`,
      `${
        actionPrefixMatcher[action as keyof typeof actionPrefixMatcher] ?? ""
      }${resourceNameWithFallback}${suffix}`,
      { id },
    );
  }

  return autoGeneratedTitle;
}
