use serde_derive::*;

#[derive(Default, Serialize, Deserialize)]
pub struct EmailConfig {
    pub source: String,
    pub region: String,
}

#[derive(Default, Clone, Serialize, Deserialize)]
pub struct PostgresConfig {
    pub host: String,
    pub port: Option<u16>,
    pub readonly_port: Option<u16>,
    pub local_port: Option<u16>,
    pub user: String,
    pub password: String,
    pub db: String,
    pub log: Option<String>,
    pub ca_file: Option<String>,
    #[serde(default = "bool_true")]
    pub use_tls: bool,
}

fn bool_true() -> bool {
    true
}

#[derive(Default, Serialize, Deserialize)]
pub struct ConfigFile {
    pub repository_cache_size: usize,
    pub change_cache_size: usize,
    pub lock_file: String,
    pub max_body_length: u64,
    pub hard_max_body_length: u64,
    pub host: String,
    pub hostname: String,
    pub origin: String,
    pub pbkdf2_iterations: usize,
    pub max_password_attempts: i64,
    pub http: HttpConfigFile,
    pub email: EmailConfig,
    pub postgres: Option<String>,
    pub ssh: SshConfigFile,
    pub workers: Option<usize>,
    pub user: Option<String>,
    pub group: Option<String>,
    pub repositories_path: String,
    pub geoip_database: String,
    pub time: TimeConfigFile,
    pub failed_auth_timeout_millis: u64,
    pub ci: CiConfigFile,
    pub partial_change_size: u64,
    pub prometheus: Prometheus,
    pub etcd_server: String,
    pub editor: Editor,
    pub webauthn: Webauthn,
    pub pro_prix_euros: u32,
    #[serde(default)]
    pub svelte_socket: Option<String>,
    pub basic_size_limit: i64,
    pub pro_size_limit: i64,
}

#[derive(Debug, Default, Serialize, Deserialize)]
pub struct HttpConfigFile {
    pub http_port: u16,
    pub https_port: u16,
    pub ws_port: u16,
    pub ws_timeout_secs: u64,
    pub time_file: String,
    pub log_file: String,
    pub timeout_secs: u64,
    pub perf_log: Option<String>,
    pub connections_log: Option<String>,
}

#[derive(Debug, Default, Serialize, Deserialize)]
pub struct SshConfigFile {
    pub port: u16,
    pub timeout_secs: u64,
}

#[derive(Debug, Default, Serialize, Deserialize)]
pub struct CiConfigFile {
    pub port: u16,
    pub key_path: String,
    pub public_key_path: Option<String>,
    pub timeout_secs: u64,
    pub public_keys: Vec<String>,
    pub log_path: String,
    pub tarball_path: String,
}

#[derive(Debug, Default, Serialize, Deserialize)]
pub struct TimeConfigFile {
    pub max_relative_days: usize,
    pub yesterday_threshold_hours: usize,
}

#[derive(Debug, Default, Serialize, Deserialize)]
pub struct Prometheus {
    pub buckets_start: f64,
    pub n_buckets: usize,
    pub buckets_width: Option<f64>,
    pub buckets_factor: Option<f64>,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Editor {
    pub port: u16,
}

#[derive(Default, Deserialize, Debug, Clone, Serialize)]
pub struct Webauthn {
    pub rp_origin: String,
    pub rp_id: String,
}