#[doc(inline)]
pub use libflorescence::diff::{
    contents_to_lines, id_hash, id_parts_hash, id_ref_hash, Combined,
    DecodedFile, DiffWithContents, DiffWithoutContents, File, FileContent, Id,
    IdHash, IdRef, Lines, Section, UndecodableContents, UndecodableFile,
};

use inflorescence_iced_widget::nav_scrollable;
use libflorescence::file;

#[derive(Debug, Default)]
pub struct State {
    pub selected_sections: Vec<usize>,
    pub expanded_unchanged_sections: Vec<usize>,
    pub collapsed_changed_sections: Vec<usize>,
}

#[derive(Debug, Default)]
pub struct FilesState {
    pub diffs: file::IdMap<State>,
    /// Diffs scrollable nav.
    ///
    /// Only the current nav is kept because the sizes of contents have to be
    /// queried everytime the selection changes due to possible container size
    /// changes.
    pub diffs_nav: nav_scrollable::State,
    #[cfg(debug_assertions)]
    pub file_id: Option<file::IdHash>,
}

pub fn init_diffs_nav(
    navs: &mut FilesState,
    #[cfg(debug_assertions)] file_id: file::IdHash,
) -> &mut nav_scrollable::State {
    navs.diffs_nav = nav_scrollable::State::default();
    #[cfg(debug_assertions)]
    {
        navs.file_id = Some(file_id);
    }
    &mut navs.diffs_nav
}

#[derive(Debug)]
pub struct FileAndState {
    pub file: File,
    pub state: State,
}