// Base filesystem class that defines the common interface for all filesystem implementations.
// Now supports multi-value result rows (bytes, sectors, etc.) in a single output line.
import { parseHex, validateInput, checkDependencies, updateResultItem } from '../utils.js';
export class BaseFilesystem {
    constructor(name, variants = []) {
        this.name = name;
        this.variants = variants; // Array of variant configurations
    }
    // Abstract method to be implemented by subclasses
    getVariants() {
        return this.variants;
    }
    // Generate HTML for constants section
    generateConstantsHTML(variantId) {
        const variant = this.variants.find(v => v.id === variantId);
        if (!variant) return '';
        // Helper function to format labels with offset information
        const formatLabel = (label) => {
            // Match patterns like "(Boot-Offset 0x00)", "(MFT-Header-Offset 0x14)", "(Offset 0x00)" and wrap offset info
            const offsetPattern = /(\((Boot-Offset|MFT-Header-Offset|Offset) [^)]+\))/g;
            return label.replace(offsetPattern, '$1');
        };
        return `
            
                Berechnete Werte
                ${variant.resultGroups.map(group => `
                    
                        ${group.name}
                        ${group.results.map(result => {
                            // For each result, show all representations in one row
                            // The calculation logic must fill in all values in the result-value element, separated by //
                            return `
                                
                            `;
                        }).join('')}
                    
 
                `).join('')}
            
 
        `;
    }
    // Generate HTML for formulas section
    generateFormulasHTML(variantId) {
        const variant = this.variants.find(v => v.id === variantId);
        if (!variant) return '';
        return `
            
                
                    
                        ${this.generateConstantsHTML(variantId)}
                        ${timestampHTML}
                    
                    
                        
Hex-Rechner
                        ${calculatorHTML}
                    
                 
                ${this.generateInputsHTML(variantId)}
                ${this.generateResultsHTML(variantId)}
                ${this.generateFormulasHTML(variantId)}
            
 
        `;
    }
    // Abstract method for calculations - to be implemented by subclasses
    calculate(variantId) {
        throw new Error('calculate method must be implemented by subclass');
    }
    // Setup input event listeners for this filesystem
    setupInputListeners(variantId) {
        const variant = this.variants.find(v => v.id === variantId);
        if (!variant) return;
        const allInputIds = [
            ...variant.constants.map(c => c.id),
            ...variant.inputs.map(i => i.id)
        ];
        allInputIds.forEach(inputId => {
            const input = document.getElementById(inputId);
            if (input) {
                input.addEventListener('input', () => {
                    validateInput(inputId, input.value);
                    this.calculate(variantId);
                });
            }
        });
    }
    // Get all input values for a variant
    getInputValues(variantId) {
        const variant = this.variants.find(v => v.id === variantId);
        if (!variant) return {};
        const values = {};
        
        // Get constants
        variant.constants.forEach(constant => {
            const element = document.getElementById(constant.id);
            if (element) {
                values[constant.id] = parseHex(element.value) || 0;
            }
        });
        // Get inputs
        variant.inputs.forEach(input => {
            const element = document.getElementById(input.id);
            if (element) {
                values[input.id] = parseHex(element.value);
            }
        });
        return values;
    }
}