import { Salarie } from "@/types/type";

export function formatAddress(salarie: Salarie | null) {
    if (!salarie) return "";

    return [
        `${salarie.TIT ?? ""} ${salarie.PRE ?? ""} ${salarie.NSA ?? ""}`,
        salarie.ADR,
        `${salarie.COP ?? ""} ${salarie.VIL ?? ""}`,
    ]
        .filter(Boolean)
        .join("\n");
}

export function formatSingleLineAddress(salarie: Salarie | null) {
    if (!salarie) return "";

    return [
        `${salarie.TIT ?? ""} ${salarie.PRE ?? ""} ${salarie.NSA ?? ""}`,
        salarie.ADR?.replace(/\\r\\n|\\r|\\n|\r\n|\r|\n/g, " - "),
        `${salarie.COP ?? ""} ${salarie.VIL ?? ""}`,
    ]
        .filter(Boolean)
        .join(" - ");
}

export function formatPhone(value?: string | number | null) {
  if (!value) return "";

  let digits = String(value).replace(/\D/g, "");

  if (digits.length === 9) {
    digits = "0" + digits;
  }

  return digits.replace(/(\d{2})(?=\d)/g, "$1 ").trim();
}
// Numéros français (10 chiffres) : saisie et affichage groupés par 2. Un numéro
// international ("+33...") ou de plus de 10 chiffres est conservé tel quel.
function isFrenchNumber(value: string) {
  return !value.includes("+") && value.replace(/\D/g, "").length <= 10;
}

export function formatPhoneInput(value?: string | number | null) {
  if (!value) return "";

  const raw = String(value);

  if (!isFrenchNumber(raw)) return raw;

  return raw
    .replace(/\D/g, "")
    .replace(/(\d{2})(?=\d)/g, "$1 ")
    .trim();
}

// Valeur stockée à partir de la saisie : chiffres (et un "+" initial), jamais de
// chaîne vide (null), sans troncature d'un numéro plus long.
export function parsePhoneInput(raw: string) {
  const cleaned = raw.replace(/[^\d+]/g, "").replace(/(?!^)\+/g, "").slice(0, 20);

  return cleaned === "" ? null : cleaned;
}

// Rétablit le 0 initial perdu des anciens numéros (9 chiffres). Ne modifie ni
// null, ni un numéro international, ni un numéro de plus de 10 chiffres.
export function normalizePhone(value?: string | number | null) {
  const parsed = parsePhoneInput(String(value ?? ""));

  if (parsed === null || parsed.includes("+")) return parsed;

  return parsed.length === 9 ? "0" + parsed : parsed;
}

export function formatNSS(nss?: string | null) {
  if (!nss) return "";

  // Les numéros corses ont 2A / 2B à la place du département.
  const cleaned = nss.replace(/[^0-9A-Za-z]/g, "").toUpperCase();

  return cleaned.replace(
    /^(\d)(\d{2})(\d{2})(\d{2}|2[AB])(\d{3})(\d{3})(\d{2})$/,
    "$1 $2 $3 $4 $5 $6 $7"
  );
}

export function formatIBAN(iban?: string | null) {
  if (!iban) return "";

  return iban
    .replace(/\s/g, "")
    .match(/.{1,4}/g)
    ?.join(" ") ?? "";
}

export function formatDate(date?: string | Date | null) {
    if (!date) return "";

    // Date déjà au format FR
    if (typeof date === "string" && date.includes("/")) {
        return date;
    }

    return new Date(date).toLocaleDateString("fr-FR");
}
export function formatDateForInput(date?: string | Date | null) {
  if (!date) return "";

  const parsedDate = new Date(date);

  if (Number.isNaN(parsedDate.getTime())) {
    return "";
  }

  return parsedDate.toISOString().split("T")[0];
}