//! Store snapshot construction helpers.

use crate::io::{NodeGraphInteractionConfig, NodeGraphRuntimeTuning, NodeGraphViewState};
use crate::runtime::events::NodeGraphStoreSnapshot;
use jellyflow_core::core::Graph;
use jellyflow_core::ops::GraphHistory;

use super::NodeGraphStore;

pub(super) struct StoreSnapshotParts<'a> {
    graph: &'a Graph,
    graph_revision: u64,
    layout_facts_revision: u64,
    view_state: &'a NodeGraphViewState,
    interaction: &'a NodeGraphInteractionConfig,
    runtime_tuning: &'a NodeGraphRuntimeTuning,
    history: &'a GraphHistory,
}

impl<'a> StoreSnapshotParts<'a> {
    pub(super) fn from_store_fields(
        graph: &'a Graph,
        graph_revision: u64,
        layout_facts_revision: u64,
        view_state: &'a NodeGraphViewState,
        interaction: &'a NodeGraphInteractionConfig,
        runtime_tuning: &'a NodeGraphRuntimeTuning,
        history: &'a GraphHistory,
    ) -> Self {
        Self {
            graph,
            graph_revision,
            layout_facts_revision,
            view_state,
            interaction,
            runtime_tuning,
            history,
        }
    }

    fn from_store(store: &'a NodeGraphStore) -> Self {
        Self::from_store_fields(
            &store.graph,
            store.graph_revision,
            store.layout_facts_revision,
            &store.view_state,
            &store.interaction,
            &store.runtime_tuning,
            &store.history,
        )
    }

    pub(super) fn snapshot(&self) -> NodeGraphStoreSnapshot<'a> {
        NodeGraphStoreSnapshot::new(
            self.graph,
            self.graph_revision,
            self.layout_facts_revision,
            self.view_state,
            self.interaction,
            self.runtime_tuning,
            self.history,
        )
    }
}

impl NodeGraphStore {
    pub(super) fn snapshot(&self) -> NodeGraphStoreSnapshot<'_> {
        StoreSnapshotParts::from_store(self).snapshot()
    }
}
