//! Iris SFC - Vue Single File Component Compiler
//! Iris SFC - Vue 单文件组件编译器
//!
//! 提供 Vue SFC 的解析、编译和组件加载功能。
//! 输出包含 Vue 元素的 HTML 超集。

mod compiler;
mod error;
mod component_loader;
mod vue_dynamic;
mod vue_css;
mod ts_transpiler;

pub use compiler::*;
pub use error::*;
pub use component_loader::*;
pub use vue_dynamic::*;
pub use vue_css::*;
pub use ts_transpiler::*;

/// 样式块
#[derive(Debug, Clone)]
pub struct StyleBlock {
    pub css: String,
    pub scoped: bool,
}

/// SFC 模块（已编译的 Vue 单文件组件）
#[derive(Debug, Clone)]
pub struct SfcModule {
    pub name: String,
    pub script: String,
    pub render_fn: String,
    pub styles: Vec<StyleBlock>,
}

/// 初始化 SFC 子系统
pub fn init() {
    // 暂无需初始化操作
}

/// 从文件路径编译 Vue SFC 文件
pub fn compile<P: AsRef<std::path::Path>>(path: P) -> Result<SfcModule, String> {
    use std::fs;
    let source = fs::read_to_string(&path)
        .map_err(|e| format!("Failed to read SFC file {}: {}", path.as_ref().display(), e))?;
    
    let compiled = compile_vue(&source)?;
    let loaded = load_vue_component(&path)?;
    
    Ok(SfcModule {
        name: compiled.name,
        script: loaded.script_content,
        render_fn: compiled.render_fn,
        styles: loaded.styles.into_iter().map(|css| StyleBlock {
            css,
            scoped: false,
        }).collect(),
    })
}

/// 编译 Vue SFC 文件（简化 API）
pub fn compile_vue(vue_source: &str) -> Result<CompiledVueSFC, String> {
    VueSFCCompiler::compile(vue_source)
}

/// 加载并解析 Vue SFC（包含子组件展开）
pub fn load_vue_component<P: AsRef<std::path::Path>>(
    vue_path: P,
) -> Result<ParsedVueSFC, String> {
    let base_path = vue_path.as_ref().parent()
        .unwrap_or(std::path::Path::new("."))
        .to_path_buf();
    
    let mut loader = VueComponentLoader::new(base_path);
loader.load_and_parse(vue_path)
}

/// 从字符串编译 SFC（测试用）
pub fn compile_from_string(name: &str, source: &str) -> Result<SfcModule, String> {
    let compiled = compile_vue(source)?;
    Ok(SfcModule {
        name: name.to_string(),
        script: source.to_string(),
        render_fn: compiled.render_fn,
        styles: compiled.styles.into_iter().map(|css| StyleBlock {
            css,
            scoped: false,
        }).collect(),
    })
}
