export const MAX_FOREIGN_IDENTIFIER_LENGTH = 30;

const PERSIAN_DIGITS = "۰۱۲۳۴۵۶۷۸۹";
const ARABIC_DIGITS = "٠١٢٣٤٥٦٧٨٩";

export function toAsciiDigits(value: string): string {
  return value.replace(/[۰-۹٠-٩]/g, (ch) => {
    const persian = PERSIAN_DIGITS.indexOf(ch);
    if (persian >= 0) {
      return String(persian);
    }
    const arabic = ARABIC_DIGITS.indexOf(ch);
    return arabic >= 0 ? String(arabic) : ch;
  });
}

export function sanitizePersonIdentifier(raw: string, isForeign: boolean): string {
  const ascii = toAsciiDigits(raw);
  if (isForeign) {
    return ascii.slice(0, MAX_FOREIGN_IDENTIFIER_LENGTH);
  }

  return ascii.replace(/\D/g, "").slice(0, 10);
}

/** Detect whether a token is a 10-digit national code or a foreign identifier. */
export function parsePersonIdentifierToken(
  raw: string,
): { national_code: string; is_foreign_national: boolean } | null {
  const token = toAsciiDigits(raw).trim();
  if (!token || token.length > MAX_FOREIGN_IDENTIFIER_LENGTH) {
    return null;
  }

  if (/^\d{10}$/.test(token)) {
    return { national_code: token, is_foreign_national: false };
  }

  const digits = token.replace(/\D/g, "");
  const compact = token.replace(/[\s-]/g, "");
  if (digits.length === 10 && compact === digits) {
    return { national_code: digits, is_foreign_national: false };
  }

  if (!/[0-9A-Za-z]/.test(token)) {
    return null;
  }

  return { national_code: token, is_foreign_national: true };
}

export function isCompletePersonIdentifier(code: string, isForeign: boolean): boolean {
  const trimmed = code.trim();
  if (isForeign) {
    return trimmed.length > 0 && trimmed.length <= MAX_FOREIGN_IDENTIFIER_LENGTH;
  }

  return trimmed.length === 10;
}
