#!/usr/bin/env node
// Compare UI export CSV with MCP data to identify discrepancies
const fs = require('fs');
// Parse the UI CSV data
const uiCsvContent = `"groupBy","2025-07-16","2025-07-17","2025-07-18","2025-07-19","2025-07-20","2025-07-21","2025-07-22","2025-07-23","2025-07-24","2025-07-25","2025-07-26","2025-07-27","2025-07-28","2025-07-29","2025-07-30","2025-07-31","2025-08-01","2025-08-02","2025-08-03","2025-08-04","2025-08-05","2025-08-06","2025-08-07","2025-08-08","2025-08-09","2025-08-10","2025-08-11","2025-08-12","2025-08-13","2025-08-14","2025-08-15","2025-08-16","2025-08-17","2025-08-18","2025-08-19","2025-08-20","2025-08-21","2025-08-22","2025-08-23"
"AmazonCloudWatch","196.68288151421126","193.90091801946846","202.5132040778832","208.50923218225478","222.56046011284377","204.01611576437912","228.52705383178744","255.67124339266775","216.8055207468458","199.3970962027484","199.63213159249426","210.91250777675492","215.98039116029224","236.650944064537","216.81055481751164","223.55762608785545","184.04474927860574","166.01170751351913","182.9246281485415","198.5030184002399","191.45241802548693","185.0955147890043","205.57010892387672","205.24484294857052","199.38036862977646","234.93824352172697","212.5099945696006","190.00885468451668","237.66987117296884","176.97810287498555","185.73182408203553","176.44954666040195","350.6173483889874","198.58151806015638","206.70842922704702","303.32250407653027","210.82346481286737","234.65223450860225","202.58001208879512"`;
// Parse CSV
const lines = uiCsvContent.split('\n');
const headers = lines[0].split(',').map(h => h.replace(/"/g, ''));
const values = lines[1].split(',').map(v => v.replace(/"/g, ''));
// Build UI data map
const uiData = {};
for (let i = 1; i < headers.length; i++) {
uiData[headers[i]] = parseFloat(values[i]);
}
// MCP data from our successful retrieval
const mcpData = {
"2025-07-28": 218.55,
"2025-07-29": 239.16,
"2025-07-30": 219.35,
"2025-07-31": 226.08,
"2025-08-01": 186.45,
"2025-08-02": 166.64,
"2025-08-03": 183.30,
"2025-08-04": 201.06,
"2025-08-05": 193.93,
"2025-08-06": 187.54,
"2025-08-07": 207.99,
"2025-08-08": 207.10,
"2025-08-09": 199.84,
"2025-08-10": 235.40,
"2025-08-11": 214.45,
"2025-08-12": 191.86,
"2025-08-13": 239.32,
"2025-08-14": 177.44,
"2025-08-15": 186.85,
"2025-08-16": 176.93,
"2025-08-17": 351.09,
"2025-08-18": 199.06,
"2025-08-19": 207.19,
"2025-08-20": 303.80,
"2025-08-21": 211.30,
"2025-08-22": 235.13,
"2025-08-23": 203.12,
"2025-08-24": 195.39,
"2025-08-25": 112.50
};
console.log('🔍 COMPARING UI EXPORT VS MCP DATA');
console.log('=' .repeat(70));
// Find overlapping dates
const overlappingDates = Object.keys(mcpData).filter(date => uiData[date] !== undefined);
console.log(`\n📊 Analysis Period:`);
console.log(` UI Data: ${Object.keys(uiData)[0]} to ${Object.keys(uiData)[Object.keys(uiData).length - 1]}`);
console.log(` MCP Data: ${Object.keys(mcpData)[0]} to ${Object.keys(mcpData)[Object.keys(mcpData).length - 1]}`);
console.log(` Overlapping dates: ${overlappingDates.length}`);
// Compare overlapping dates
console.log('\n📈 DETAILED COMPARISON (Overlapping Dates):');
console.log('-'.repeat(70));
console.log('Date | UI Export | MCP Data | Difference | % Diff');
console.log('-'.repeat(70));
let totalUi = 0;
let totalMcp = 0;
let maxDiff = 0;
let maxDiffDate = '';
overlappingDates.sort().forEach(date => {
const uiValue = uiData[date];
const mcpValue = mcpData[date];
const diff = mcpValue - uiValue;
const percentDiff = ((diff / uiValue) * 100).toFixed(1);
totalUi += uiValue;
totalMcp += mcpValue;
if (Math.abs(diff) > Math.abs(maxDiff)) {
maxDiff = diff;
maxDiffDate = date;
}
const dateObj = new Date(date + 'T12:00:00Z');
const dayName = dateObj.toLocaleDateString('en-US', { weekday: 'short' });
console.log(
`${date} (${dayName}) | $${uiValue.toFixed(2).padStart(9)} | $${mcpValue.toFixed(2).padStart(9)} | ${diff >= 0 ? '+' : ''}$${diff.toFixed(2).padStart(7)} | ${percentDiff.padStart(6)}%`
);
});
console.log('-'.repeat(70));
console.log(`TOTALS | $${totalUi.toFixed(2).padStart(9)} | $${totalMcp.toFixed(2).padStart(9)} | ${totalMcp >= totalUi ? '+' : ''}$${(totalMcp - totalUi).toFixed(2).padStart(7)} | ${((totalMcp - totalUi) / totalUi * 100).toFixed(1).padStart(6)}%`);
// Calculate statistics
const avgUi = totalUi / overlappingDates.length;
const avgMcp = totalMcp / overlappingDates.length;
console.log('\n📊 KEY FINDINGS:');
console.log(` Average daily (UI): $${avgUi.toFixed(2)}`);
console.log(` Average daily (MCP): $${avgMcp.toFixed(2)}`);
console.log(` Average difference: $${(avgMcp - avgUi).toFixed(2)} (${((avgMcp - avgUi) / avgUi * 100).toFixed(1)}%)`);
console.log(` Max difference: $${Math.abs(maxDiff).toFixed(2)} on ${maxDiffDate}`);
// Check specific high-variance dates
console.log('\n⚠️ NOTABLE DISCREPANCIES:');
const aug17Ui = uiData['2025-08-17'];
const aug17Mcp = mcpData['2025-08-17'];
console.log(` Aug 17: UI = $${aug17Ui.toFixed(2)}, MCP = $${aug17Mcp.toFixed(2)}, Diff = $${(aug17Mcp - aug17Ui).toFixed(2)}`);
const aug20Ui = uiData['2025-08-20'];
const aug20Mcp = mcpData['2025-08-20'];
console.log(` Aug 20: UI = $${aug20Ui.toFixed(2)}, MCP = $${aug20Mcp.toFixed(2)}, Diff = $${(aug20Mcp - aug20Ui).toFixed(2)}`);
// Calculate UI total for full period
const uiTotal = Object.values(uiData).reduce((sum, val) => sum + val, 0);
console.log('\n💰 FULL PERIOD TOTALS:');
console.log(` UI Export (Jul 16 - Aug 23): $${uiTotal.toFixed(2)} (${Object.keys(uiData).length} days)`);
console.log(` MCP Data (Jul 28 - Aug 25): $${Object.values(mcpData).reduce((sum, val) => sum + val, 0).toFixed(2)} (${Object.keys(mcpData).length} days)`);
// Show dates missing from MCP
const missingFromMcp = Object.keys(uiData).filter(date => !mcpData[date]);
console.log(`\n📅 Dates in UI but not MCP (${missingFromMcp.length}):`);
console.log(` ${missingFromMcp.slice(0, 5).join(', ')}...`);
console.log('\n🔍 ANALYSIS SUMMARY:');
console.log('1. Both datasets show the same general patterns');
console.log('2. Small differences (~1-3%) on most days');
console.log('3. Both correctly identify the Aug 17 spike ($350+)');
console.log('4. Both show similar daily variations');
console.log('5. The differences could be due to:');
console.log(' - Rounding differences in API responses');
console.log(' - Different precision in calculations');
console.log(' - Potential caching or timing differences');
console.log(' - API version differences between UI and MCP endpoints');
console.log('\n✅ CONCLUSION: MCP data closely matches UI export with minor variations!');