use actix_web::HttpRequest;
use askama::Template;
use crate::config::Config;
#[derive(Template)]
#[template(path = "index.html")]
pub struct TplIndex<'a> {
    pub lang: &'a str,
    pub csrf_token: &'a str,
}
#[derive(Template)]
#[template(path = "error.html")]
pub struct TplError<'a> {
    pub lang: &'a str,
    pub error_msg: &'a str,
}
#[derive(Template)]
#[template(path = "link.html")]
pub struct TplLink<'a> {
    pub lang: &'a str,
    pub admin_token: &'a str,
    pub config: &'a Config,
}


pub fn get_lang(req: &HttpRequest) -> String {
    // getting language from client header
    // taking the two first characters of the Accept-Language header,
    // in lowercase, then parsing it.
    // if it fails, returns "en"
    if let Some(l) = req.headers().get("Accept-Language") {
        if let Ok(s) = l.to_str() {
            return s.to_lowercase()[..2].to_string();
        }
    }
    String::from("en")
}
mod filters {
    use crate::config::LOC;
    pub fn tr(key: &str, lang: &str) -> askama::Result<String> {
        let translation = LOC.get(key).ok_or_else(|| {
            eprintln!("tr filter: couldn't find the key {}", key);
            askama::Error::from(std::fmt::Error)
        })?;
        Ok(String::from(
            translation
                .get(lang)
                .unwrap_or(translation.get("en").ok_or_else(|| {
                    eprintln!("tr filter: couldn't find the lang {} in key {}", lang, key);
                    askama::Error::from(std::fmt::Error)
                })?)
                .as_str()
                .ok_or_else(|| {
                    eprintln!("tr filter: lang {} in key {} is not str", lang, key);
                    askama::Error::from(std::fmt::Error)
                })?,
        ))
    }
}

