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

namespace Hafenstudios\Leadlotse\Submit;

use Hafenstudios\Core\Core;
use Hafenstudios\Core\Mail\Message;

defined( 'ABSPATH' ) || exit;

/**
 * Bestaetigungs-, Benachrichtigungs- und DOI-Mails ueber den Core-Mailer.
 * Alle Texte in Sie-Form, ohne Em Dashes, mit Platzhaltern {name}, {form},
 * {site}, {confirm_url}.
 */
final class MailService {

	/**
	 * Benachrichtigung an die Empfaenger des Formulars.
	 *
	 * @param array<string, mixed> $entry      Gespeicherter Entry.
	 * @param array<string, mixed> $definition Formular-Definition.
	 * @param string               $form_title Formular-Titel.
	 * @return void
	 */
	public function send_notification( array $entry, array $definition, string $form_title ): void {
		$settings = (array) ( $definition['settings'] ?? array() );
		$config   = (array) ( $settings['notification'] ?? array() );
		if ( isset( $config['enabled'] ) && ! $config['enabled'] ) {
			return;
		}

		$recipients = (array) ( $settings['recipients'] ?? array() );
		if ( array() === $recipients ) {
			$recipients = array( (string) get_option( 'admin_email' ) );
		}

		$subject = (string) ( $config['subject'] ?? '' );
		if ( '' === $subject ) {
			$subject = sprintf(
				/* translators: 1: Formular-Titel, 2: Site-Name */
				__( 'Neue Anfrage ueber "%1$s" auf %2$s', 'leadlotse' ),
				$form_title,
				(string) get_bloginfo( 'name' )
			);
		}

		$lines   = array();
		$lines[] = esc_html__( 'Es ist eine neue Anfrage eingegangen. Die Angaben im Ueberblick:', 'leadlotse' );
		$lines[] = '';
		foreach ( (array) $entry['field_values'] as $key => $value ) {
			$label   = $this->field_label( (string) $key, $definition );
			$lines[] = esc_html( $label ) . ': ' . esc_html( is_array( $value ) ? implode( ', ', $value ) : (string) $value );
		}
		$lines[] = '';
		$lines[] = esc_html__( 'Sie finden die Anfrage in der Leadlotse-Inbox in Ihrem WordPress-Admin.', 'leadlotse' );

		$mailer = Core::instance()->mailer();
		foreach ( $recipients as $recipient ) {
			$message           = new Message( (string) $recipient, $subject, nl2br( implode( "\n", $lines ) ) );
			$message->reply_to = (string) ( $entry['email'] ?? '' );
			$mailer->send( $message );
		}
	}

	/**
	 * Bestaetigungsmail an die einsendende Person.
	 *
	 * @param array<string, mixed> $entry      Entry.
	 * @param array<string, mixed> $definition Definition.
	 * @param string               $form_title Formular-Titel.
	 * @return void
	 */
	public function send_confirmation( array $entry, array $definition, string $form_title ): void {
		$config = (array) ( $definition['settings']['confirmation'] ?? array() );
		$email  = (string) ( $entry['email'] ?? '' );
		if ( empty( $config['enabled'] ) || '' === $email ) {
			return;
		}

		$subject = (string) ( $config['subject'] ?? '' );
		if ( '' === $subject ) {
			$subject = sprintf(
				/* translators: %s: Site-Name */
				__( 'Wir haben Ihre Anfrage erhalten - %s', 'leadlotse' ),
				(string) get_bloginfo( 'name' )
			);
		}

		$body = (string) ( $config['body'] ?? '' );
		if ( '' === $body ) {
			$body = __( "Guten Tag,\n\nvielen Dank fuer Ihre Anfrage. Wir haben Ihre Nachricht erhalten und melden uns so schnell wie moeglich bei Ihnen.\n\nFreundliche Gruesse\n{site}", 'leadlotse' );
		}

		$body = $this->replace_placeholders( $body, $entry, $form_title );

		Core::instance()->mailer()->send( new Message( $email, $subject, nl2br( esc_html( $body ) ) ) );
	}

	/**
	 * DOI-Mail mit Bestaetigungslink (Zweck Newsletter, D9).
	 *
	 * @param array<string, mixed> $entry       Entry.
	 * @param string               $confirm_url Signierter Bestaetigungslink.
	 * @return void
	 */
	public function send_doi_mail( array $entry, string $confirm_url ): void {
		$email = (string) ( $entry['email'] ?? '' );
		if ( '' === $email || '' === $confirm_url ) {
			return;
		}

		$subject = sprintf(
			/* translators: %s: Site-Name */
			__( 'Bitte bestaetigen Sie Ihre Anmeldung - %s', 'leadlotse' ),
			(string) get_bloginfo( 'name' )
		);

		$body  = '<p>' . esc_html__( 'Guten Tag,', 'leadlotse' ) . '</p>';
		$body .= '<p>' . esc_html__( 'vielen Dank fuer Ihre Anmeldung. Bitte bestaetigen Sie Ihre E-Mail-Adresse mit einem Klick auf den folgenden Link. Erst danach ist Ihre Anmeldung wirksam.', 'leadlotse' ) . '</p>';
		$body .= '<p><a href="' . esc_url( $confirm_url ) . '">' . esc_html__( 'Anmeldung jetzt bestaetigen', 'leadlotse' ) . '</a></p>';
		$body .= '<p>' . esc_html__( 'Wenn Sie sich nicht angemeldet haben, ignorieren Sie diese Nachricht einfach. Es wird dann nichts gespeichert.', 'leadlotse' ) . '</p>';
		$body .= '<p>' . esc_html( (string) get_bloginfo( 'name' ) ) . '</p>';

		Core::instance()->mailer()->send( new Message( $email, $subject, $body ) );
	}

	/**
	 * Label eines Felds aus der Definition (Fallback: Feld-ID).
	 *
	 * @param string               $field_id   Feld-ID.
	 * @param array<string, mixed> $definition Definition.
	 * @return string
	 */
	private function field_label( string $field_id, array $definition ): string {
		foreach ( (array) ( $definition['fields'] ?? array() ) as $field ) {
			if ( is_array( $field ) && ( $field['id'] ?? '' ) === $field_id && '' !== (string) ( $field['label'] ?? '' ) ) {
				return (string) $field['label'];
			}
		}
		return $field_id;
	}

	/**
	 * Ersetzt die Mail-Platzhalter.
	 *
	 * @param string               $text       Text mit Platzhaltern.
	 * @param array<string, mixed> $entry      Entry.
	 * @param string               $form_title Formular-Titel.
	 * @return string
	 */
	private function replace_placeholders( string $text, array $entry, string $form_title ): string {
		$values = (array) ( $entry['field_values'] ?? array() );
		$name   = (string) ( $values['name'] ?? '' );

		return strtr(
			$text,
			array(
				'{name}'       => $name,
				'{first_name}' => (string) ( $values['first_name'] ?? $name ),
				'{form}'       => $form_title,
				'{site}'       => (string) get_bloginfo( 'name' ),
			)
		);
	}
}
