use iri_string::types::UriAbsoluteString;

use crate::event_loop::{EditorContentsChange, ExtensionState};

#[tracing::instrument(skip(extension_state))]
pub async fn handle(
    uri: UriAbsoluteString,
    changes: Vec<EditorContentsChange>,
    extension_state: &mut ExtensionState,
) {
    let Some((_repository_path, relative_path, repository)) =
        extension_state.get_repository_mut(&uri)
    else {
        tracing::info!(message = "Ignoring text content changes");
        return;
    };

    for change in changes {
        let EditorContentsChange {
            character_offset,
            characters_replaced,
            replacement_text,
        } = change;

        if let Err(error) = repository.repository.update_open_file(
            relative_path,
            character_offset as usize,
            characters_replaced as usize,
            &replacement_text,
        ) {
            tracing::error!(message = "Failed to update open file", ?error);
            return;
        }

        tracing::info!(message = "Updated open file");
    }
}