<?php

namespace WtbFirewall\Config;

// Prevent direct access.
if (!defined('ABSPATH')) {
    exit;
}

/**
 * Denne klassen brukes til å holde global konfigurasjon for firewall.
 */
class FirewallConfig {

    /**
     * Tilsvarer feltet  block_mode  i WP options.
     * 
     * @var int Angir block mode for firewall, 1 = ALLOW ALL, 2 = DENY ALL
     */
    public static int $blockMode = 1;

    /**
     * Angir hvor ofte loggen skal automatisk slettes.
     * Hvis satt til 0 blir loggen aldri slettet.
     * 
     * @var int Log entries eldre enn dette (i dager) blir slettet.
     */
    public static int $logDays = 30;

    /**
     * Angir om alle data skal slettes ved avinstallering av plugin.
     * 
     * @var bool TRUE = Slett alt,  FALSE = ikke slett noe. Kun avinstaller firewall.
     */
    public static bool $deleteOnUninstall = false;

    /**
     * Holder innstillingene for automatisk blokkering ved mislykket autentisering.
     */
    public static array $autoProtectAuth = [
        'enabled' => false, //Om blokkering for mislykket autentisering er av/på.
        'attempts' => 15, //Antall mislykkete forsøk før blokkering.
        'timeSpan' => 60, //Over hvor lang tid mislykkete forsøk skal telles.
        'timeSpanUnit' => 'minutes', //Over hvor lang tid mislykkete forsøk skal telles; minutes, hours, days.
        'blockTime' => 12, //Hvor lenge en blokkering skal vare.
        'blockTimeUnit' => 'hours', //Hvor lenge en blokkering skal vare,
        'wpLogin' => true, //Gjelder for wp-login
        'XMLRPC' => true, //Gjelder for xml-rpc
        'REST' => true, //Gjelder for REST
    ];

    /**
     * Holder innstillingene for automatisk blokkering via rate limiting og 404 monitor.     
     */
    public static array $rateLimit = [
        'enabled' => false, //Om rate limiting er av/på.
        'requestsPerMinute' => 300, //Antall requests per minutt før blokkering.
        'blockMinutes' => 10, //Hvor lenge en blokkering skal vare, i minutter.
        'errors404Enabled' => false, //Om 404 monitor er av/på (blokkering basert på 404 feil).
        'errors404PerMinute' => 20, //Antall 404 feil per minutt før blokkering.
        'errors404BlockMinutes' => 10, //Hvor lenge en 404 blokkering skal vare, i minutter.
    ];

    /**
     * Holder innstillingene for trafikk loggen.
     */
    public static array $trafficLog = [
        'enabled' => false, //Om vi skal logge trafikk eller ikke.
        'logDays' => 30, //Hvor lenge loggen skal vare, i dager. Eldre innhold blir slettet.
        'ignoreUsers' => false, //Hvis TRUE blir innloggete brukere ikke logget i frontend.
        'ignoreDashboard' => false, //Hvis TRUE blir innloggete brukere ikke logget i backend.
    ];

    /**
     * Holder innstillingene for proxy server.
     */
    public static array $proxyServer = [
        'enabled' => false, //Om proxy server skal brukes eller ikke.
        'header' => 'auto', //Hvilken proxy header som skal brukes.       
        'proxyListIpv4' => [], //Liste over IPv4 proxy servere. I samme format som returnert fra Firewall()::parseIpv4Input()
        'proxyListIpv6' => [], //Liste over IPv6 proxy servere. I samme format som returnert fra Firewall()::parseIpv6Input()
    ];

    /**
     * Henter options fra WP options.
     */
    public static function loadOptions() {

        $settings = get_option('wtb_firewall_settings', array());

        self::$blockMode = isset($settings['block_mode']) ? (int) $settings['block_mode'] : 1;
        self::$logDays = isset($settings['log_days']) ? (int) $settings['log_days'] : 30;
        self::$deleteOnUninstall = isset($settings['delete_on_uninstall']) ? (bool) $settings['delete_on_uninstall'] : false;

        if (isset($settings['auto_protect_auth'])) {
            self::$autoProtectAuth = $settings['auto_protect_auth'];
        }

        if (isset($settings['rate_limit'])) {
            self::$rateLimit = $settings['rate_limit'];
        }

        if (isset($settings['traffic_log'])) {
            self::$trafficLog = $settings['traffic_log'];
        }

        if (isset($settings['proxy_server'])) {
            self::$proxyServer = $settings['proxy_server'];
        }

        //For proxy server. Alle IPv6 hex strings gjøres om til binary strings.
        foreach (self::$proxyServer['proxyListIpv6'] as &$row) {
            if (isset($row['ipv6'])) {
                $row['ipv6'] = hex2bin($row['ipv6']);
            }
        }
    }

    /**
     * Lagrer options i WP options.
     */
    public static function saveOptions() {

        //For proxy server. Gjør om alle IPv6 addresser (binary string) til hex strings.
        //Ellers blir de ikke lagret riktig.
        $proxy = self::$proxyServer;
        foreach ($proxy['proxyListIpv6'] as &$row) {
            if (isset($row['ipv6'])) {
                $row['ipv6'] = bin2hex($row['ipv6']);
            }
        }

        $settings = array(
            'block_mode' => self::$blockMode,
            'log_days' => self::$logDays,
            'delete_on_uninstall' => self::$deleteOnUninstall,
            'auto_protect_auth' => self::$autoProtectAuth,
            'rate_limit' => self::$rateLimit,
            'traffic_log' => self::$trafficLog,
            'proxy_server' => $proxy,
        );

        update_option('wtb_firewall_settings', $settings, 'no');
    }
}
