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

// Test configuration
const TEST_TIMEOUT = 60000; // 1 minute per test

// Colors for console output
const colors = {
    reset: '\x1b[0m',
    bright: '\x1b[1m',
    green: '\x1b[32m',
    red: '\x1b[31m',
    yellow: '\x1b[33m',
    blue: '\x1b[34m',
    cyan: '\x1b[36m',
    magenta: '\x1b[35m'
};

function log(message, type = 'info') {
    const timestamp = new Date().toISOString().split('T')[1].split('.')[0];
    const typeColors = {
        'info': colors.cyan,
        'success': colors.green,
        'error': colors.red,
        'warning': colors.yellow,
        'section': colors.blue,
        'test': colors.magenta
    };
    const color = typeColors[type] || colors.reset;
    console.log(`${color}[${timestamp}] ${message}${colors.reset}`);
}

// Core test files to verify functionality
const testFiles = [
    'test_auth_flow.js',
    'test_simple_auth.js',
    'test_settings_page.js',
    'test_simple_research.js',
    'test_history_page.js'
];

// Test results
const results = {
    total: testFiles.length,
    passed: 0,
    failed: 0,
    details: []
};

async function runTest(testFile) {
    return new Promise((resolve) => {
        const testPath = path.join(__dirname, testFile);

        const startTime = Date.now();
        const testProcess = spawn('node', [testPath], {
            cwd: __dirname,
            env: { ...process.env, NODE_ENV: 'test' }
        });
        let lastOutput = '';
        let errorOutput = '';

        // Capture stdout - only show last line
        testProcess.stdout.on('data', (data) => {
            const text = data.toString();
            const lines = text.trim().split('\n');
            if (lines.length > 0) {
                lastOutput = lines[lines.length - 1];
                // Show progress
                process.stdout.write('.');
            }
        });

        // Capture stderr
        testProcess.stderr.on('data', (data) => {
            errorOutput += data.toString();
        });

        // Set timeout
        const timeout = setTimeout(() => {
            log(`\n⏱️ Test timeout after ${TEST_TIMEOUT/1000} seconds`, 'error');
            testProcess.kill('SIGTERM');
        }, TEST_TIMEOUT);

        // Handle test completion
        testProcess.on('close', (code) => {
            clearTimeout(timeout);
            const duration = ((Date.now() - startTime) / 1000).toFixed(2);

            if (code === 0) {
                log(`\n✅ ${testFile} passed (${duration}s)`, 'success');
                results.passed++;
                results.details.push({
                    name: testFile,
                    status: 'passed',
                    duration
                });
            } else {
                log(`\n❌ ${testFile} failed with code ${code} (${duration}s)`, 'error');
                if (errorOutput) {
                    log(`Error: ${errorOutput.substring(0, 200)}...`, 'error');
                }
                results.failed++;
                results.details.push({
                    name: testFile,
                    status: 'failed',
                    duration,
                    code
                });
            }

            resolve();
        });

        // Handle errors
        testProcess.on('error', (error) => {
            clearTimeout(timeout);
            log(`\n❌ Failed to run ${testFile}: ${error.message}`, 'error');
            results.failed++;
            results.details.push({
                name: testFile,
                status: 'failed',
                error: error.message
            });
            resolve();
        });
    });
}

async function runCoreTests() {
    log('🚀 Starting LDR Core UI Tests', 'section');
    log('This will run essential tests only\n', 'info');

    // Check if server is running
    const http = require('http');
    const serverCheck = await new Promise((resolve) => {
        http.get('http://127.0.0.1:5000/', () => {
            resolve(true);
        }).on('error', () => {
            resolve(false);
        });
    });

    if (!serverCheck) {
        log('❌ Server is not running on http://127.0.0.1:5000', 'error');
        process.exit(1);
    }

    log('✅ Server is running\n', 'success');

    // Run tests
    const startTime = Date.now();

    for (const testFile of testFiles) {
        log(`\nRunning ${testFile}`, 'test');
        await runTest(testFile);
    }

    const totalDuration = ((Date.now() - startTime) / 1000).toFixed(2);

    // Summary
    log('\n' + '='.repeat(50), 'section');
    log('📊 CORE TEST SUMMARY', 'section');
    log('='.repeat(50), 'section');
    log(`Total Tests: ${results.total}`, 'info');
    log(`✅ Passed: ${results.passed}`, 'success');
    log(`❌ Failed: ${results.failed}`, results.failed > 0 ? 'error' : 'info');
    log(`⏱️ Total Duration: ${totalDuration}s`, 'info');

    // Exit
    process.exit(results.failed > 0 ? 1 : 0);
}

// Run tests
runCoreTests().catch(error => {
    log(`\n❌ Test error: ${error.message}`, 'error');
    process.exit(1);
});
