use crate::app::AppArgs;
use std::path::PathBuf;

#[derive(Clone)]
pub enum AppContext {
    Debug,
    Production,
}

#[derive(Clone)]
pub struct AppConfig {
    pub exec_path: PathBuf,
    pub exec_name: String,
    pub context: AppContext,
    pub storage_dir: PathBuf,
    pub host: String,
    pub port: u16,
    pub port_tls: u16,
    pub load: Option<PathBuf>,
    pub ssl_certs_dir: PathBuf,
    pub admin_id: String,
    pub admin_pwd: String,
}

impl AppConfig {
    pub fn new(app_args: AppArgs) -> Self {
        let exec_path = std::env::current_exe().unwrap();
        let exec_name = exec_path
            .file_name()
            .expect("Unable to get executable name")
            .to_str()
            .unwrap()
            .to_string();

        let context = match app_args.context.as_str() {
            "prod" => AppContext::Production,
            _ => AppContext::Debug,
        };

        let storage_dir = match &app_args.app_storage_root {
            Some(dir) => dir.join(&exec_name),
            None => match context {
                AppContext::Production => PathBuf::from("/var").join(&exec_name),
                AppContext::Debug => dirs::home_dir()
                    .expect("Unable to get home dir")
                    .join(&exec_name),
            },
        };

        let ssl_certs_dir = app_args.ssl_certs_dir.join(&app_args.host);

        AppConfig {
            exec_path: std::path::PathBuf::from(exec_path),
            exec_name,
            context,
            storage_dir,
            host: app_args.host,
            port: app_args.port,
            port_tls: app_args.port_tls,
            load: app_args.load,
            ssl_certs_dir,
            admin_id: app_args.admin_id,
            admin_pwd: app_args.admin_pwd,
        }
    }
    pub fn get_log_level(&self) -> String {
        match self.context {
            AppContext::Debug => "debug".to_string(),
            AppContext::Production => "info".to_string(),
        }
    }
}