/**
 * @fileoverview Core OrdoJS Framework - Main entry point (Refactored)
 * @author OrdoJS Framework Team
 */

import type { ComponentDefinition } from './runtime/component-system.js';

import { ComponentFactory } from './runtime/component-system.js';


// Core compiler exports (refactored modular versions)
export { OrdoJSCodeGenerator, type CodeGeneratorOptions, type CodeTransformer } from './compiler/code-generator-refactored.js';
export { OrdoJSLexer, type LexerOptions, type TokenProcessor } from './compiler/lexer-refactored.js';
export { OrdoJSParser, type ASTNodeProcessor, type ParserOptions } from './compiler/parser-refactored.js';

// Runtime exports (new signal-based reactivity)
export {
    batch, combineSignals, computed, debouncedSignal, derived, effect, fromEvent, fromPromise, persistentSignal, reactivity, signal, throttledSignal, writableDerived, type ComputedSignal,
    type EffectCleanup, type Signal
} from './runtime/reactivity.js';

// Component system exports
export {
    ComponentFactory, ComponentLifecycle, Fragment, componentFactory, createComponent, createComponentByName, defineComponent,
    h, registerComponent, type ComponentContext, type ComponentDefinition,
    type ComponentInstance, type LifecycleHooks, type PropSchema, type SetupContext,
    type VNode
} from './runtime/component-system.js';

// Legacy exports (for backward compatibility)
export * from './compiler/index.js';
export * from './runtime/index.js';
export * from './types/index.js';

/**
 * Version information for the OrdoJS core package
 */
export const VERSION = '0.5.0-beta.5';

/**
 * Framework metadata
 */
export const FRAMEWORK_INFO = {
  name: 'OrdoJS',
  version: VERSION,
  description: 'A revolutionary web framework with compile-time optimizations and signal-based reactivity',
  architecture: 'modular',
  features: [
    'Signal-based reactivity',
    'Modular compiler architecture',
    'Plugin-based transformations',
    'Component composition',
    'TypeScript-first'
  ]
} as const;

/**
 * Create a new OrdoJS application
 */
export function createApp(rootComponent: ComponentDefinition, props: any = {}) {
  const factory = new ComponentFactory({ devMode: process.env.NODE_ENV !== 'production' });
  const instance = factory.create(rootComponent, props);

  return {
    mount: (selector: string | Element) => {
      const target = typeof selector === 'string'
        ? document.querySelector(selector)
        : selector;

      if (!target) {
        throw new Error(`Mount target not found: ${selector}`);
      }

      return instance.mount(target as Element);
    },
    unmount: () => instance.unmount(),
    instance
  };
}
