/**
 * @fileoverview Debug HTML element parsing step by step
 */

import { describe, expect, it } from 'vitest';
import { OrdoJSLexer } from './lexer.js';
import { OrdoJSParser } from './parser.js';

describe('Debug HTML Parsing', () => {
  it('should trace HTML element parsing', () => {
    const source = `
      component TestComponent {
        markup {
          <div>Hello World</div>
        }
      }
    `;

    const lexer = new OrdoJSLexer(source, 'test.ordo');
    const tokens = lexer.tokenize();

    // Create a custom parser with debug logging
    class DebugParser extends (OrdoJSParser as any) {
      parseHTMLElement() {
        console.log('\n=== Starting parseHTMLElement ===');
        console.log('Current token position:', this.tokens.current);
        console.log('Current token:', this.tokens.peek());

        const result = super.parseHTMLElement();

        console.log('=== Finished parseHTMLElement ===');
        console.log('Final token position:', this.tokens.current);
        console.log('Final token:', this.tokens.peek());
        console.log('Parsed element:', { tagName: result.tagName, childrenCount: result.children.length });

        return result;
      }

      checkClosingTag(tagName: string) {
        const result = super.checkClosingTag(tagName);
        console.log(`checkClosingTag("${tagName}") at position ${this.tokens.current}:`, result);
        console.log('  Current token:', this.tokens.peek());
        return result;
      }

      parseClosingTag(tagName: string) {
        console.log(`\n--- parseClosingTag("${tagName}") ---`);
        console.log('Before - position:', this.tokens.current, 'token:', this.tokens.peek());

        super.parseClosingTag(tagName);

        console.log('After - position:', this.tokens.current, 'token:', this.tokens.peek());
      }
    }

    const parser = new DebugParser(tokens, { allowRecovery: true }, 'test.ordo');

    // Advance to the HTML_TAG_OPEN token for <div>
    tokens.current = 8; // Position at <div>

    try {
      const element = parser.parseHTMLElement();
      console.log('\nParsing succeeded!');
      console.log('Element:', element);
    } catch (error) {
      console.log('\nParsing failed:', error.message);
      console.log('Final position:', tokens.current);
      console.log('Final token:', tokens.peek());
    }

    expect(true).toBe(true);
  });
});
