import { createHmac } from "crypto";

/** Verhoeff algorithm for Aadhaar checksum validation */
const D = [
  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
  [1, 2, 3, 4, 0, 6, 7, 8, 9, 5],
  [2, 3, 4, 0, 1, 7, 8, 9, 5, 6],
  [3, 4, 0, 1, 2, 8, 9, 5, 6, 7],
  [4, 0, 1, 2, 3, 9, 5, 6, 7, 8],
  [5, 9, 8, 7, 6, 0, 4, 3, 2, 1],
  [6, 5, 9, 8, 7, 1, 0, 4, 3, 2],
  [7, 6, 5, 9, 8, 2, 1, 0, 4, 3],
  [8, 7, 6, 5, 9, 3, 2, 1, 0, 4],
  [9, 8, 7, 6, 5, 4, 3, 2, 1, 0],
];

const P = [
  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
  [1, 5, 7, 6, 2, 8, 3, 0, 9, 4],
  [5, 8, 0, 3, 7, 9, 6, 1, 4, 2],
  [8, 9, 1, 6, 0, 4, 3, 5, 2, 7],
  [9, 4, 5, 3, 1, 2, 6, 8, 7, 0],
  [4, 2, 8, 6, 5, 7, 3, 9, 0, 1],
  [2, 7, 9, 3, 8, 0, 6, 4, 1, 5],
  [7, 0, 4, 6, 9, 1, 3, 2, 5, 8],
];

export function normalizeAadhaar(input: string): string {
  return input.replace(/\s+/g, "").trim();
}

export function isValidAadhaarFormat(aadhaar: string): boolean {
  const n = normalizeAadhaar(aadhaar);
  if (!/^\d{12}$/.test(n)) return false;
  if (/^(\d)\1{11}$/.test(n)) return false;
  return verhoeffCheck(n);
}

function verhoeffCheck(num: string): boolean {
  let c = 0;
  const reversed = num.split("").reverse().map(Number);
  for (let i = 0; i < reversed.length; i++) {
    c = D[c][P[i % 8][reversed[i]]];
  }
  return c === 0;
}

function aadhaarPepper(): string {
  return (
    process.env.AADHAAR_PEPPER ||
    process.env.JWT_SECRET ||
    "kumbh"
  );
}

/** HMAC-SHA256 of normalized Aadhaar using AADHAAR_PEPPER (preferred) / JWT_SECRET. */
export function hashAadhaar(aadhaar: string): string {
  const n = normalizeAadhaar(aadhaar);
  return createHmac("sha256", aadhaarPepper()).update(n).digest("hex");
}

export function maskAadhaar(aadhaar: string): string {
  const n = normalizeAadhaar(aadhaar);
  return `XXXX XXXX ${n.slice(-4)}`;
}

export function last4(aadhaar: string): string {
  return normalizeAadhaar(aadhaar).slice(-4);
}

export function isValidIndianMobile(mobile: string): boolean {
  return /^[6-9]\d{9}$/.test(mobile.replace(/\s+/g, ""));
}

export function normalizeMobile(mobile: string): string {
  return mobile.replace(/\s+/g, "").trim();
}

export function maskMobile(mobile: string): string {
  const m = normalizeMobile(mobile);
  return `${m.slice(0, 2)}XXXXXX${m.slice(-2)}`;
}
