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

namespace Hafenstudios\Kurato\Mail;

defined( 'ABSPATH' ) || exit;

/**
 * Normalisiert Brevo-Webhook-Payloads (K4-Konzept Abschnitt 9).
 *
 * Brevo liefert im Feld `event` den Ereignistyp und in `email` die betroffene
 * Adresse. Mapping auf die internen Kurato-Typen:
 *   hard_bounce, blocked  -> bounce_hard
 *   soft_bounce           -> bounce_soft
 *   spam                  -> complaint
 *   unsubscribe(d)        -> unsubscribe
 * Alle anderen Ereignisse (delivered, opened, click, request, deferred, ...)
 * werden ignoriert (null), damit sie folgenlos mit 200 quittiert werden.
 */
final class BrevoNormalizer implements WebhookNormalizer {

	/**
	 * Brevo-Ereignis -> internes Kurato-Ereignis.
	 *
	 * @var array<string, string>
	 */
	private const MAP = array(
		'hard_bounce'  => 'bounce_hard',
		'blocked'      => 'bounce_hard',
		'soft_bounce'  => 'bounce_soft',
		'spam'         => 'complaint',
		'unsubscribe'  => 'unsubscribe',
		'unsubscribed' => 'unsubscribe',
	);

	/**
	 * @param array<string, mixed> $payload Roher Brevo-Payload.
	 * @return array{type:string,email:string,reason:string}|null
	 */
	public function normalize( array $payload ): ?array {
		$event = strtolower( trim( (string) ( $payload['event'] ?? '' ) ) );
		if ( '' === $event || ! isset( self::MAP[ $event ] ) ) {
			return null;
		}

		$email = sanitize_email( (string) ( $payload['email'] ?? '' ) );
		if ( '' === $email ) {
			return null;
		}

		return array(
			'type'   => self::MAP[ $event ],
			'email'  => $email,
			'reason' => substr( (string) ( $payload['reason'] ?? $event ), 0, 255 ),
		);
	}
}
