use chrono::Local;
use global_placeholders::global;
use std::fs::{File, OpenOptions};
use std::io::{self, Write};

pub struct Logger {
    file: File,
}

impl Logger {
    pub fn new() -> io::Result<Self> {
        let file = OpenOptions::new().create(true).append(true).open(global!("pmc.log"))?;
        Ok(Logger { file })
    }

    pub fn write(&mut self, message: &str) {
        log::info!("{message}");
        writeln!(&mut self.file, "[{}] {}", Local::now().format("%Y-%m-%d %H:%M:%S%.3f"), message).unwrap()
    }
}

#[macro_export]
macro_rules! log {($($arg:tt)*) =>
    { log::Logger::new().unwrap().write(format!($($arg)*).as_str()) }}