#!/usr/bin/env node

/**
 * TDD Tests for Advanced State Management Recovery
 */

const { TestRunner } = require('./test_runner.js');
const runner = new TestRunner();

// Test the advanced state management system
runner.describe('Advanced State Management with EditState enum', () => {

    runner.it('should have EditState enum with 4 states', async () => {
        // Clear any existing definitions to avoid conflicts
        delete global.EditState;
        delete require.cache[require.resolve('/home/worsch/markitect_project/markitect/static/editor.js')];

        // Load our editor.js to test
        require('/home/worsch/markitect_project/markitect/static/editor.js');

        const hasEditState = global.EditState !== undefined;
        runner.expect(hasEditState).toBeTruthy();

        if (global.EditState) {
            runner.expect(global.EditState.ORIGINAL).toBe('original');
            runner.expect(global.EditState.EDITING).toBe('editing');
            runner.expect(global.EditState.MODIFIED).toBe('modified');
            runner.expect(global.EditState.SAVED).toBe('saved');
        }
    });

    runner.it('should support pending changes in Section class', async () => {
        // Editor.js already loaded above

        if (global.Section) {
            const section = new global.Section('test-id', 'original content');

            // Should have pendingMarkdown property
            runner.expect(section.pendingMarkdown).toBe(null);

            // Should have proper state management
            runner.expect(section.state).toBe('original');
        }
    });

    runner.it('should implement stopEditing with state preservation', async () => {
        if (global.Section) {
            const section = new global.Section('test-id', 'original content');

            // Start editing
            section.startEdit();
            section.updateContent('modified content');

            // Stop editing should preserve changes
            const result = section.stopEditing();

            runner.expect(section.pendingMarkdown).toBe('modified content');
            runner.expect(section.state).toBe('modified');
        }
    });

    runner.it('should implement hasChanges detection', async () => {
        if (global.Section) {
            const section = new global.Section('test-id', 'original content');

            // Initially no changes
            runner.expect(section.hasChanges()).toBe(false);

            // After modification should detect changes
            section.currentMarkdown = 'modified content';
            runner.expect(section.hasChanges()).toBe(true);
        }
    });
});

// Run the tests
if (require.main === module) {
    console.log('🧪 Running TDD Tests for State Management Recovery');
    runner.run().then(() => {
        console.log('✅ Test run complete - now implement the functionality!');
    });
}

module.exports = runner;