<?php
/**
 * @package Hafenstudios\Wellenbrecher
 */

namespace Hafenstudios\Wellenbrecher\Support;

use Hafenstudios\Core\Settings\Settings;

defined( 'ABSPATH' ) || exit;

/**
 * Beobachtungsmodus (Bauplan Kap. 6): solange observation.enabled gesetzt
 * ist UND das Fenster (wellenbrecher_activated_at + days) laeuft, wird jedes
 * Nicht-pass-Verdict nur als flagged geloggt; nichts wird geblockt oder
 * quarantaenisiert. Laeuft das Fenster ab, gilt der Modus als beendet, auch
 * ohne dass enabled zurueckgesetzt wird (kein Auto-Scharfschalten noetig).
 */
class ObservationMode {

	public const ACTIVATED_OPTION = 'wellenbrecher_activated_at';

	protected Settings $settings;

	/**
	 * @param Settings $settings Wellenbrecher-Settings.
	 */
	public function __construct( Settings $settings ) {
		$this->settings = $settings;
	}

	/**
	 * Laeuft der Beobachtungsmodus gerade?
	 *
	 * @param int|null $now Bezugszeit (Default: jetzt, fuer Tests).
	 * @return bool
	 */
	public function is_active( ?int $now = null ): bool {
		if ( empty( $this->settings->get( 'observation.enabled', true ) ) ) {
			return false;
		}
		return $this->ends_at() > ( $now ?? time() );
	}

	/**
	 * Verbleibende ganze Tage des Fensters (0, wenn abgelaufen/aus).
	 *
	 * @param int|null $now Bezugszeit (Default: jetzt).
	 * @return int
	 */
	public function remaining_days( ?int $now = null ): int {
		if ( ! $this->is_active( $now ) ) {
			return 0;
		}
		return (int) ceil( ( $this->ends_at() - ( $now ?? time() ) ) / DAY_IN_SECONDS );
	}

	/**
	 * Schaltet scharf: beendet den Beobachtungsmodus dauerhaft.
	 *
	 * @return void
	 */
	public function disable(): void {
		$this->settings->set( 'observation.enabled', false );
	}

	/**
	 * Ende des Fensters als Unix-Zeit (0, wenn kein Startpunkt bekannt).
	 *
	 * @return int
	 */
	protected function ends_at(): int {
		$started = (int) get_option( self::ACTIVATED_OPTION, 0 );
		if ( $started <= 0 ) {
			return 0;
		}
		$days = max( 0, (int) $this->settings->get( 'observation.days', 7 ) );
		return $started + ( $days * DAY_IN_SECONDS );
	}
}
