// Indicator registry and exports for self-contained indicators

// Import all indicator classes and their signal functions
export { MAIndicator, calculateMASignal } from './moving_average.js';
export { MACDIndicator, calculateMACDSignal } from './macd.js';
export { HTSIndicator, calculateHTSSignal } from './hts.js';
export { RSIIndicator, calculateRSISignal } from './rsi.js';
export { BollingerBandsIndicator, calculateBollingerBandsSignal } from './bb.js';
export { StochasticIndicator, calculateStochSignal } from './stoch.js';
export { ATRIndicator, calculateATRSignal } from './atr.js';
export { HurstBandsIndicator, calculateHurstSignal } from './hurst.js';

// Import for registry
import { MAIndicator as MAI, calculateMASignal as CMA } from './moving_average.js';
import { MACDIndicator as MACDI, calculateMACDSignal as CMC } from './macd.js';
import { HTSIndicator as HTSI, calculateHTSSignal as CHTS } from './hts.js';
import { RSIIndicator as RSII, calculateRSISignal as CRSI } from './rsi.js';
import { BollingerBandsIndicator as BBI, calculateBollingerBandsSignal as CBB } from './bb.js';
import { StochasticIndicator as STOCHI, calculateStochSignal as CST } from './stoch.js';
import { ATRIndicator as ATRI, calculateATRSignal as CATR } from './atr.js';
import { HurstBandsIndicator as HURSTI, calculateHurstSignal as CHURST } from './hurst.js';

// Signal function registry for easy dispatch
export const SignalFunctionRegistry = {
    ma: CMA,
    macd: CMC,
    hts: CHTS,
    rsi: CRSI,
    bb: CBB,
    stoch: CST,
    atr: CATR,
    hurst: CHURST
};

// Indicator registry for UI
export const IndicatorRegistry = {
    ma: MAI,
    macd: MACDI,
    hts: HTSI,
    rsi: RSII,
    bb: BBI,
    stoch: STOCHI,
    atr: ATRI,
    hurst: HURSTI
};

/**
 * Get list of available indicators for the UI catalog
 */
export function getAvailableIndicators() {
    return Object.entries(IndicatorRegistry).map(([type, IndicatorClass]) => {
        const instance = new IndicatorClass({ type, params: {}, name: '' });
        const meta = instance.getMetadata();
        return {
            type,
            name: meta.name || type.toUpperCase(),
            description: meta.description || ''
        };
    });
}

/**
 * Get signal function for an indicator type
 * @param {string} indicatorType - The type of indicator (e.g., 'ma', 'rsi')
 * @returns {Function|null} The signal calculation function or null if not found
 */
export function getSignalFunction(indicatorType) {
    return SignalFunctionRegistry[indicatorType] || null;
}