import fs from 'fs'; import path from 'path'; const DATA_DIR = path.resolve(process.cwd(), 'public/data'); if (!fs.existsSync(DATA_DIR)) { console.error("Data directory not found."); process.exit(1); } const files = fs.readdirSync(DATA_DIR).filter(f => f.endsWith('.json') && f !== 'lakes_index.json'); files.forEach(file => { const filePath = path.join(DATA_DIR, file); const data = JSON.parse(fs.readFileSync(filePath, 'utf-8')); if (data.length === 0) return; // The oldest record currently in DB const oldest = data[0]; const oldestTime = new Date(oldest.timestamp).getTime(); const newRecords: any[] = []; let currentLevel = oldest.level; let currentFlow = oldest.flow; let currentInflow = oldest.inflow || (Math.random() * 10 + 5); // Generate 720 records (30 days * 24 hours) going BACKWARDS for (let i = 1; i <= 720; i++) { const d = new Date(oldestTime - i * 60 * 60 * 1000); // random walk for level currentLevel = currentLevel + (Math.random() - 0.5) * 0.05; // random walk for outflow and inflow currentFlow = Math.max(0, currentFlow + (Math.random() - 0.5) * 2); currentInflow = Math.max(0, currentInflow + (Math.random() - 0.5) * 2); // Temperature: daily sine wave (colder at night, warmer in day) + noise const hour = d.getHours(); const tempBase = 18; // base 18C const tempDay = Math.sin(((hour - 6) / 24) * Math.PI * 2) * 8; // cold morning, warm afternoon const randomTemp = tempBase + tempDay + (Math.random() - 0.5) * 2; // Precipitation: rare spikes const randomPrecip = Math.random() > 0.95 ? Math.random() * 15 : 0; newRecords.push({ timestamp: d.toISOString(), level: currentLevel, flow: currentFlow, inflow: currentInflow, volume: oldest.volume, // volume changes too slow, keep constant for mock temperature: randomTemp, precipitation: randomPrecip }); } // Combine: newRecords are older, so reverse them to make chronological (oldest first), then add real data const allRecords = [...newRecords.reverse(), ...data]; fs.writeFileSync(filePath, JSON.stringify(allRecords, null, 2)); console.log(`Generated 30 days of realistic mock history for ${file}`); });