use {
    crate::config::{get_config_bool, get_config_str},
    crate::constants::{LOG_DIR, LOG_ENABLED},
    simplelog::{
        CombinedLogger, Config, ConfigBuilder, LevelFilter, TermLogger, TerminalMode, WriteLogger,
    },
    std::fs::OpenOptions,
};

fn debug_config() -> Config {
    ConfigBuilder::new()
        .set_target_level(LevelFilter::Info)
        .add_filter_ignore_str("tokio_reactor")
        .build()
}

async fn log_location(name: &str) -> String {
    let log_file = format!("{}.log", name);
    let mut log_dir = get_config_str(LOG_DIR, "").await;
    if log_dir.len() > 0 && !log_dir.ends_with(std::path::MAIN_SEPARATOR) {
        log_dir = format!("{}{}", log_dir, std::path::MAIN_SEPARATOR);
    }
    format!("{}{}", log_dir, log_file)
}

async fn is_enabled() -> bool {
    get_config_bool(LOG_ENABLED, false).await
}

pub(crate) async fn setup_logger(name: &str) {
    if !is_enabled().await {
        return;
    }
    let file = OpenOptions::new()
        .write(true)
        .append(true)
        .create(true)
        .open(log_location(name).await)
        .expect("could not open log file");
    CombinedLogger::init(vec![
        TermLogger::new(LevelFilter::Error, Config::default(), TerminalMode::Mixed)
            .expect("could not initialize error logger"),
        WriteLogger::new(LevelFilter::Debug, debug_config(), file),
    ])
    .expect("could not initialize logs");
    log::debug!("Logging configured");
}
