//! Story generation processing module

use anyhow::Result;
use momentry_core::ui::progress::{ProcessorType, ProgressState, ProgressUi};
use momentry_core::OutputDir;
use std::path::Path;
use std::sync::{Arc, Mutex};

/// Process Story module
pub async fn process_story_module(
    story_path: &Path,
    video_path: &str,
    uuid: &str,
    progress_state: &Arc<Mutex<ProgressState>>,
    ui: &Arc<Mutex<Option<ProgressUi>>>,
) -> Result<()> {
    {
        let mut state = progress_state.lock().unwrap();
        state.get_processor(ProcessorType::Story).start(1);
    }

    let story_result = momentry_core::core::processor::process_story(
        video_path,
        story_path.to_str().unwrap(),
        Some(uuid),
    )
    .await?;

    let story_json = serde_json::to_string_pretty(&story_result)?;
    std::fs::write(story_path, &story_json)?;

    let output_dir = OutputDir::new();
    let _ = output_dir.backup_file(uuid, "story.json");

    println!(
        "  ✓ Story saved: {} parent chunks, {} child chunks",
        story_result.stats.total_parent_chunks, story_result.stats.total_child_chunks
    );

    {
        let mut state = progress_state.lock().unwrap();
        state.get_processor(ProcessorType::Story).complete(&format!(
            "{} parents, {} children",
            story_result.stats.total_parent_chunks, story_result.stats.total_child_chunks
        ));
    }

    if let Some(ref mut ui) = *ui.lock().unwrap() {
        let _ = ui.render();
    }

    Ok(())
}
