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

namespace Hafenstudios\Kurato\Campaign;

defined( 'ABSPATH' ) || exit;

/**
 * Reine, testbare Zusammenfassung der Kampagnen-Statistik (K4-Konzept
 * Abschnitt 7, K4e-2).
 *
 * Fuehrt die Queue-Zaehlung (versendet/fehlgeschlagen/uebersprungen, Server-
 * Fakten) mit den Ereignis-Zaehlungen (Abmeldungen, Bounces, Beschwerden und -
 * nur bei Tracking-Consent - Oeffnungen/Klicks) zusammen. Ohne Tracking bleibt
 * die Statistik aussagekraeftig: die Server-Ereignisse brauchen keine
 * Einwilligung. Open-/Klick-Zahlen werden ausschliesslich mit der ehrlichen
 * Bezugsgroesse `consented` ("Empfaenger mit Tracking-Einwilligung")
 * ausgewiesen, nie als Prozent der Gesamtempfaengerzahl.
 *
 * Keine WordPress-Abhaengigkeit, damit die Zaehl-Logik isoliert pruefbar ist.
 */
final class CampaignStats {

	/**
	 * Baut die Statistik aus Queue- und Ereignis-Zaehlungen.
	 *
	 * @param array<string, int> $queue_counts   Queue-Zaehlung je Status
	 *                                            (pending/sending/sent/failed/skipped).
	 * @param array<string, int> $event_counts   Ereignis-Zaehlung je Typ
	 *                                            (counts_for_campaign).
	 * @param bool               $tracking_on     Ist Site-Tracking aktiv?
	 * @param int                $consented       Empfaenger mit Tracking-Einwilligung.
	 * @return array{
	 *   sent:int, failed:int, skipped:int,
	 *   unsubscribes:int, bounces:int, complaints:int,
	 *   tracking:bool, consented:int, opens:int, clicks:int
	 * }
	 */
	public static function summarize( array $queue_counts, array $event_counts, bool $tracking_on, int $consented ): array {
		$ev = static function ( string $type ) use ( $event_counts ): int {
			return (int) ( $event_counts[ $type ] ?? 0 );
		};

		return array(
			'sent'         => (int) ( $queue_counts['sent'] ?? 0 ),
			'failed'       => (int) ( $queue_counts['failed'] ?? 0 ),
			'skipped'      => (int) ( $queue_counts['skipped'] ?? 0 ),
			'unsubscribes' => $ev( 'unsubscribe' ),
			'bounces'      => $ev( 'bounce_hard' ) + $ev( 'bounce_soft' ),
			'complaints'   => $ev( 'complaint' ),
			'tracking'     => $tracking_on,
			'consented'    => $tracking_on ? max( 0, $consented ) : 0,
			'opens'        => $tracking_on ? $ev( 'open' ) : 0,
			'clicks'       => $tracking_on ? $ev( 'click' ) : 0,
		);
	}
}
