use std::{fs, path::Path, time::SystemTime};

use anyhow::Context;
use chrono::{DateTime, Local};
use convert_case::{Case, Casing};
use log::debug;

use crate::{
    config_file::Config,
    file_tree::{FileTree, GeneratedFile},
};

pub fn generate_new_section(
    config: &Config,
    name: String,
    project_root: &Path,
    chapter_name: &str,
) -> anyhow::Result<FileTree> {
    let chapter_root = project_root.join("content").join(chapter_name);
    debug!("Chapter root is: {}", chapter_root.display());

    let mut file_tree = FileTree::new();

    let new_section_text = config
        .templates
        .section
        .replace("REPLACMENT_SECTION_TITLE", &name)
        .replace(
            "DATE",
            &format!(
                "{}",
                // FIXME: The time is not really precise enough to display the time.  <2024-03-31>
                DateTime::<Local>::from(SystemTime::now()).format("%Y-%m-%d (%_H:%_S)")
            ),
        );

    let new_section_file = GeneratedFile::new(
        chapter_root
            .join("sections")
            .join(format!("{}.tex", name.to_case(Case::Snake))),
        new_section_text,
    );
    file_tree.add_file(new_section_file);

    let chapter_file_path = chapter_root.join("chapter.tex");
    let mut chapter_file_text = fs::read_to_string(&chapter_file_path).with_context(|| {
        format!(
            "Failed to read the chapter main file ('{}') to string",
            &chapter_file_path.display(),
        )
    })?;

    chapter_file_text.push_str(&format!(
        "\\input{{content/{}/sections/{}}}\n",
        chapter_name,
        &name.to_case(Case::Snake)
    ));

    let chapter_file = GeneratedFile::new(chapter_file_path, chapter_file_text);
    file_tree.add_file(chapter_file);

    Ok(file_tree)
}