import { createCipheriv, createDecipheriv, createHash, randomBytes, randomInt } from "node:crypto";

function key() { return createHash("sha256").update(process.env.CARD_ENCRYPTION_KEY ?? process.env.SESSION_SECRET ?? process.env.DATABASE_URL ?? "trust-world-card-key").digest(); }
export function encryptCardValue(value: string) { const iv=randomBytes(12); const cipher=createCipheriv("aes-256-gcm",key(),iv); const encrypted=Buffer.concat([cipher.update(value,"utf8"),cipher.final()]); const tag=cipher.getAuthTag(); return `${iv.toString("base64url")}.${tag.toString("base64url")}.${encrypted.toString("base64url")}`; }
export function decryptCardValue(value: string) { const [iv,tag,data]=value.split("."); const decipher=createDecipheriv("aes-256-gcm",key(),Buffer.from(iv,"base64url")); decipher.setAuthTag(Buffer.from(tag,"base64url")); return Buffer.concat([decipher.update(Buffer.from(data,"base64url")),decipher.final()]).toString("utf8"); }
export const encryptSensitiveValue = encryptCardValue;
export const decryptSensitiveValue = decryptCardValue;
function luhnDigit(partial:string){ let sum=0; const digits=(partial+"0").split("").map(Number); for(let i=digits.length-2;i>=0;i-=2){let n=digits[i]*2;if(n>9)n-=9;digits[i]=n} for(const n of digits)sum+=n; return String((10-(sum%10))%10); }
export function generateCardNumber(network:"Visa"|"Mastercard"){ const prefix=network==="Visa"?"4":String(randomInt(51,56)); let partial=prefix; while(partial.length<15)partial+=String(randomInt(0,10)); return partial+luhnDigit(partial); }
export function generateCvv(){ return String(randomInt(0,1000)).padStart(3,"0"); }
