const path = require('path');
const { spawn } = require('child_process');

function outputProgress(data) {
    if (!data.status) {
        data = {
            status: 'running',
            ...data
        };
    }
    console.log(JSON.stringify(data));
}

function runScript(scriptPath) {
    return new Promise((resolve, reject) => {
        const child = spawn('node', [scriptPath], {
            stdio: ['inherit', 'pipe', 'pipe']
        });

        let output = '';

        child.stdout.on('data', (data) => {
            const lines = data.toString().split('\n');
            lines.filter(line => line.trim()).forEach(line => {
                try {
                    console.log(line); // Pass through the JSON output
                    output += line + '\n';
                } catch (e) {
                    console.log(line); // If not JSON, just log it directly
                }
            });
        });

        child.stderr.on('data', (data) => {
            console.error(data.toString());
        });

        child.on('close', (code) => {
            if (code !== 0) {
                reject(new Error(`Script ${scriptPath} exited with code ${code}`));
            } else {
                resolve(output);
            }
        });

        child.on('error', (err) => {
            reject(err);
        });
    });
}

async function fullUpdate() {
    try {
        // Step 1: Import from Production
        outputProgress({
            operation: 'Starting full update',
            message: 'Step 1/2: Importing from production...'
        });
        await runScript(path.join(__dirname, 'import-from-prod.js'));
        outputProgress({
            status: 'complete',
            operation: 'Import step complete',
            message: 'Import finished, moving to metrics calculation...'
        });

        // Step 2: Calculate Metrics
        outputProgress({
            operation: 'Starting metrics calculation',
            message: 'Step 2/2: Calculating metrics...'
        });
        await runScript(path.join(__dirname, 'calculate-metrics-new.js'));
        outputProgress({
            status: 'complete',
            operation: 'Metrics step complete',
            message: 'Metrics calculation finished'
        });

        // Final completion message
        outputProgress({
            status: 'complete',
            operation: 'Full update complete',
            message: 'Successfully completed all steps: import and metrics calculation'
        });
    } catch (error) {
        outputProgress({
            status: 'error',
            operation: 'Full update failed',
            error: error.message,
            stack: error.stack
        });
        process.exit(1);
    }
}

// Run if called directly
if (require.main === module) {
    fullUpdate();
}

module.exports = fullUpdate; 