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

namespace Hafenstudios\Leadlotse\Events;

use Hafenstudios\Core\Core;
use Hafenstudios\Core\Events\EventBus;
use Hafenstudios\Core\Mail\Message;
use Hafenstudios\Leadlotse\Db\EntryRepository;
use Hafenstudios\Leadlotse\Forms\FormPostType;

defined( 'ABSPATH' ) || exit;

/**
 * Ticket-Mail fuer Veranstaltungs-Anmeldungen (L-R1).
 *
 * Haengt an den bestehenden Flotten-Events: bei Formularen mit DOI kommt das
 * Ticket erst NACH der Bestaetigung (lead_confirmed, ueber die vorhandene
 * DOI-Pipeline); ohne DOI direkt nach dem Absenden (lead_created). Die Mail
 * enthaelt die Veranstaltungsdaten und den tokenisierten Link zur
 * druckfaehigen Ticket-Seite.
 */
final class TicketMailer {

	private EntryRepository $entries;

	private TicketToken $tokens;

	/**
	 * @param EntryRepository $entries Entry-Repository.
	 * @param TicketToken     $tokens  Token-Dienst.
	 */
	public function __construct( EntryRepository $entries, TicketToken $tokens ) {
		$this->entries = $entries;
		$this->tokens  = $tokens;
	}

	/**
	 * Verdrahtet die Event-Listener.
	 *
	 * @return void
	 */
	public function register(): void {
		EventBus::on( 'lead_created', array( $this, 'on_lead_created' ), 10, 1 );
		EventBus::on( 'lead_confirmed', array( $this, 'on_lead_confirmed' ), 10, 1 );
	}

	/**
	 * Ohne DOI kommt das Ticket sofort.
	 *
	 * @param array<string, mixed> $payload Event-Nutzlast.
	 * @return void
	 */
	public function on_lead_created( $payload ): void {
		if ( ! is_array( $payload ) || ! empty( $payload['doi'] ) ) {
			return;
		}
		$this->maybe_send( absint( $payload['entry_id'] ?? 0 ) );
	}

	/**
	 * Mit DOI kommt das Ticket nach der Bestaetigung.
	 *
	 * @param array<string, mixed> $payload Event-Nutzlast.
	 * @return void
	 */
	public function on_lead_confirmed( $payload ): void {
		if ( ! is_array( $payload ) ) {
			return;
		}
		$this->maybe_send( absint( $payload['entry_id'] ?? 0 ) );
	}

	/**
	 * Sendet die Ticket-Mail, wenn das Formular eine Veranstaltung ist.
	 *
	 * @param int $entry_id Entry-ID.
	 * @return void
	 */
	private function maybe_send( int $entry_id ): void {
		$entry = $entry_id > 0 ? $this->entries->get( $entry_id ) : null;
		if ( null === $entry || '' === (string) ( $entry['email'] ?? '' ) ) {
			return;
		}

		$definition = FormPostType::get_definition( (int) $entry['form_id'] );
		if ( null === $definition || ! EventCapacity::is_event( $definition ) ) {
			return;
		}

		$event      = (array) ( $definition['settings']['event'] ?? array() );
		$title      = (string) ( $event['title'] ?? '' );
		$values     = (array) ( $entry['field_values'] ?? array() );
		$name       = (string) ( $values['first_name'] ?? ( $values['name'] ?? '' ) );
		$persons    = EventCapacity::persons( $values, $definition );
		$ticket_url = TicketPage::ticket_url( $this->tokens->create( $entry_id, TicketToken::PURPOSE_TICKET ) );

		$subject = '' !== $title
			? sprintf(
				/* translators: %s: Veranstaltungstitel */
				__( 'Ihr Ticket: %s', 'leadlotse' ),
				$title
			)
			: __( 'Ihr Ticket zur Veranstaltung', 'leadlotse' );

		$greeting = '' !== $name
			? sprintf(
				/* translators: %s: Vorname */
				__( 'Guten Tag %s,', 'leadlotse' ),
				$name
			)
			: __( 'Guten Tag,', 'leadlotse' );

		$body  = '<p>' . esc_html( $greeting ) . '</p>';
		$body .= '<p>' . esc_html__( 'Ihre Anmeldung ist bestaetigt. Hier sind die Daten Ihrer Veranstaltung:', 'leadlotse' ) . '</p>';
		$body .= '<p>';
		if ( '' !== $title ) {
			$body .= '<strong>' . esc_html( $title ) . '</strong><br />';
		}
		$date = TicketPage::format_event_date( (string) ( $event['date'] ?? '' ) );
		if ( '' !== $date ) {
			$body .= esc_html__( 'Datum:', 'leadlotse' ) . ' ' . esc_html( $date ) . '<br />';
		}
		$location = (string) ( $event['location'] ?? '' );
		if ( '' !== $location ) {
			$body .= esc_html__( 'Ort:', 'leadlotse' ) . ' ' . esc_html( $location ) . '<br />';
		}
		$body .= esc_html__( 'Personen:', 'leadlotse' ) . ' ' . (int) $persons;
		$body .= '</p>';
		$body .= '<p><a href="' . esc_url( $ticket_url ) . '">' . esc_html__( 'Ticket anzeigen und ausdrucken', 'leadlotse' ) . '</a></p>';
		$body .= '<p>' . esc_html__( 'Bringen Sie das Ticket ausgedruckt oder auf dem Handy mit. Der QR-Code wird am Einlass gescannt.', 'leadlotse' ) . '</p>';

		$event_url = (string) ( $event['url'] ?? '' );
		if ( '' !== $event_url ) {
			$body .= '<p><a href="' . esc_url( $event_url ) . '">' . esc_html__( 'Weitere Informationen zur Veranstaltung', 'leadlotse' ) . '</a></p>';
		}

		$body .= '<p>' . esc_html( (string) get_bloginfo( 'name' ) ) . '</p>';

		Core::instance()->mailer()->send( new Message( (string) $entry['email'], $subject, $body ) );
	}
}
