const Asset = require('../models/Asset'); // Helper to get today's date string (DDMMYY) const getTodayDateStr = () => { const now = new Date(); const istOffset = 5.5 * 60 * 60 * 1000; const istDate = new Date(now.getTime() + istOffset); const dd = String(istDate.getUTCDate()).padStart(2, '0'); const mm = String(istDate.getUTCMonth() + 1).padStart(2, '0'); const yy = String(istDate.getUTCFullYear()).slice(-2); return `${dd}${mm}${yy}`; }; // Check if a number is available for today const checkAvailability = async (number) => { const dateStr = getTodayDateStr(); // Regex to match any tier prefix but specific date and number // Pattern: [XX][DATE][D][NUMBER] // We just check if the "number" part (last 6 digits) exists for today // Actually, simpler: Store 'daily_sequence' in Asset or check KUS suffix // Let's stick to the requested format: [SYMBOL][DATE][DAY][NUMBER] // We need to query if any asset ends with this number for TODAY const startOfDay = new Date(); startOfDay.setHours(0,0,0,0); const exists = await Asset.findOne({ purchase_date: { $gte: startOfDay }, kus_id: { $regex: `${number}$` } // Ends with the number }); return !exists; }; // Generate KUS (Random or Specific) const generateKUS = async (tier, requestedNumber = null) => { const symbols = { Silver: "AG", Gold: "AU", Platinum: "PT" }; const symbol = symbols[tier]; const dateStr = getTodayDateStr(); const days = ['S', 'M', 'T', 'W', 'T', 'F', 'S']; const istDate = new Date(new Date().getTime() + (5.5 * 60 * 60 * 1000)); const dayInitial = days[istDate.getUTCDay()]; let finalNumber; if (requestedNumber) { // Validate availability const isAvailable = await checkAvailability(requestedNumber); if (!isAvailable) throw new Error("Number already taken today"); finalNumber = requestedNumber; } else { // Random Shuffle Logic (Try until unique) let attempts = 0; while (attempts < 50) { const random = Math.floor(Math.random() * 1000000).toString().padStart(6, '0'); if (await checkAvailability(random)) { finalNumber = random; break; } attempts++; } if (!finalNumber) throw new Error("High traffic. Try again."); } // Format: AU171225W000000 // Note: Requested 6 digits (0 to 1 million) -> 000000 to 999999 return `${symbol}${dateStr}${dayInitial}${finalNumber}`; }; module.exports = { generateKUS, checkAvailability };