import type { ReactNode } from "react";
import { ExternalLink } from "lucide-react";

import { cn } from "@/lib/utils";

export function displayValue(
  value: string | number | null | undefined,
  fallback = "—",
): string {
  if (value == null) return fallback;
  const trimmed = String(value).trim();
  return trimmed || fallback;
}

/**
 * Format a numeric or string amount. Skips prefixing raw numeric currency ids
 * (bond APIs sometimes return those instead of ISO codes).
 */
export function formatRecordMoney(
  value: number | string | null | undefined,
  currency?: string | null,
): string {
  let numeric: number | null = null;

  if (typeof value === "number") {
    numeric = Number.isFinite(value) ? value : null;
  } else {
    const raw = (value ?? "").trim();
    if (!raw) return "—";
    const parsed = Number(raw.replace(/,/g, ""));
    if (!Number.isFinite(parsed)) return raw;
    numeric = parsed;
  }

  if (numeric == null) return "—";

  const formatted = numeric.toLocaleString("en-US", {
    minimumFractionDigits: 2,
    maximumFractionDigits: 2,
  });
  const code = (currency ?? "").trim();
  if (code && !/^\d+$/.test(code)) {
    return `${code} ${formatted}`;
  }
  return formatted;
}

export function RecordDetailRow({
  label,
  value,
  mono,
}: {
  label: string;
  value: string;
  mono?: boolean;
}) {
  return (
    <div className="grid grid-cols-[minmax(0,9rem)_minmax(0,1fr)] gap-3 text-sm sm:grid-cols-[minmax(0,11rem)_minmax(0,1fr)]">
      <dt className="text-muted-foreground">{label}</dt>
      <dd
        className={cn(
          "min-w-0 break-words font-medium text-foreground/90",
          mono && "font-mono tracking-tight",
        )}
      >
        {value}
      </dd>
    </div>
  );
}

export function RecordViewSection({
  title,
  icon,
  children,
}: {
  title: string;
  icon: ReactNode;
  children: ReactNode;
}) {
  return (
    <section className="rounded-2xl border border-border/60 bg-card/80 p-5 shadow-sm">
      <div className="mb-4 flex items-center gap-2">
        <span className="flex size-8 items-center justify-center rounded-full bg-muted text-muted-foreground">
          {icon}
        </span>
        <h2 className="font-semibold text-sm tracking-tight">{title}</h2>
      </div>
      <dl className="space-y-3">{children}</dl>
    </section>
  );
}

export function RecordExternalLinkRow({ href, label = "Link" }: { href: string; label?: string }) {
  const trimmed = href.trim();
  if (!trimmed) return null;

  return (
    <div className="grid grid-cols-[minmax(0,9rem)_minmax(0,1fr)] gap-3 text-sm sm:grid-cols-[minmax(0,11rem)_minmax(0,1fr)]">
      <dt className="text-muted-foreground">{label}</dt>
      <dd>
        <a
          href={trimmed}
          target="_blank"
          rel="noreferrer"
          className="inline-flex items-center gap-1 font-medium text-teal-700 hover:underline dark:text-teal-400"
        >
          Open
          <ExternalLink className="size-3.5" />
        </a>
      </dd>
    </div>
  );
}
