use schemars::JsonSchema;
use serde::Deserialize;

use super::auth_result::AuthResultConfiguration;
use super::token::hmac::configuration::HMACRuleConfiguration;
use super::token::jwt::configuration::JWTRuleConfiguration;

#[derive(Clone, Debug, Deserialize, JsonSchema)]
pub struct RuleConfiguration {
    pub jwt: JWTRuleConfiguration,
    pub hmac: HMACRuleConfiguration,
    pub malformed_auth: AuthResultConfiguration,
    pub missing_auth: AuthResultConfiguration,
    pub multiple_auth: AuthResultConfiguration,
    pub unknown_auth: AuthResultConfiguration,
}

#[derive(Clone, Debug, Deserialize, JsonSchema)]
pub struct Configuration {
    pub enabled: bool,
    pub rules: RuleConfiguration,
}

#[cfg(test)]
mod test {
    use super::*;

    impl RuleConfiguration {
        pub fn all_ok() -> RuleConfiguration {
            RuleConfiguration {
                jwt: JWTRuleConfiguration::all_ok(),
                hmac: HMACRuleConfiguration::all_ok(),
                malformed_auth: AuthResultConfiguration::Ok,
                missing_auth: AuthResultConfiguration::Ok,
                multiple_auth: AuthResultConfiguration::Ok,
                unknown_auth: AuthResultConfiguration::Ok,
            }
        }

        pub fn all_warning() -> RuleConfiguration {
            RuleConfiguration {
                jwt: JWTRuleConfiguration::all_warning(),
                hmac: HMACRuleConfiguration::all_warning(),
                malformed_auth: AuthResultConfiguration::Warning,
                missing_auth: AuthResultConfiguration::Warning,
                multiple_auth: AuthResultConfiguration::Warning,
                unknown_auth: AuthResultConfiguration::Warning,
            }
        }

        pub fn all_block() -> RuleConfiguration {
            RuleConfiguration {
                jwt: JWTRuleConfiguration::all_block(),
                hmac: HMACRuleConfiguration::all_block(),
                malformed_auth: AuthResultConfiguration::Block,
                missing_auth: AuthResultConfiguration::Block,
                multiple_auth: AuthResultConfiguration::Block,
                unknown_auth: AuthResultConfiguration::Block,
            }
        }
    }
}
