use std::{
    env,
    fs::{self, OpenOptions},
    io::{self, Write},
    path::{Path, PathBuf},
    process::Command,
};

use inquire::Text;
use temp_file::{TempFile, TempFileBuilder};

use crate::md::{Entry, ToMd};

// TODO: the usual (better error handling)
pub fn add_entry(path: &Path, title: Option<String>) -> io::Result<()> {
    if !path.exists() {
        eprintln!("Journal file does not exist at {path:?}, exiting...");
        std::process::exit(1);
    }

    let title = Text::new("Title").prompt().unwrap();

    let tmp = TempFileBuilder::new()
        .suffix(".jrnl-entry.md")
        .build()
        .unwrap();

    let editor = match env::var("EDITOR") {
        Ok(val) => val,
        Err(env::VarError::NotPresent) => {
            eprintln!("EDITOR not set, exiting...");
            std::process::exit(1);
        }
        _ => unreachable!(),
    };

    let mut editor_cmd = Command::new(&editor);
    editor_cmd.arg(tmp.path());
    editor_cmd.status().unwrap();

    let content = fs::read_to_string(tmp.path()).unwrap();

    let now = chrono::offset::Local::now();

    let entry = Entry {
        timestamp: now.fixed_offset(),
        title: &title,
        content: &content,
    };

    let mut file = OpenOptions::new()
        .write(true)
        .append(true)
        .open(path)
        .unwrap();

    write!(file, "{}", entry.to_md())?;

    Ok(())
}
