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

namespace Hafenstudios\Leadlotse\Admin;

use Hafenstudios\Core\Core;
use Hafenstudios\Leadlotse\Db\EntryRepository;
use Hafenstudios\Leadlotse\Forms\FormPostType;

defined( 'ABSPATH' ) || exit;

/**
 * Einrichtungs-Checkliste "Klar zum Auslaufen" (Etappe 5, UX-Grundsatz 9).
 *
 * Datengetrieben und selbstberechnend: zeigt oben auf der Formularliste die
 * ersten Schritte mit Fortschritt (X von Y). Verschwindet dauerhaft, sobald alle
 * Schritte erledigt sind. Hans begleitet den ersten Schritt (Motiv 30).
 *
 * Bewusst KEIN eigener Speicher fuer den Fortschritt: Der Status ergibt sich aus
 * den echten Daten (Formulare, Einsendungen), nicht aus Flags, die veralten.
 */
final class SetupChecklist {

	private EntryRepository $entries;

	/**
	 * @param EntryRepository $entries Entry-Repository (Anfragen-Zahl).
	 */
	public function __construct( EntryRepository $entries ) {
		$this->entries = $entries;
	}

	/**
	 * Rendert die Checkliste oder nichts, wenn alle Schritte erledigt sind.
	 *
	 * @return void
	 */
	public function render(): void {
		$steps = $this->steps();
		$done  = 0;
		foreach ( $steps as $step ) {
			if ( $step['done'] ) {
				$done++;
			}
		}

		// Fertig eingerichtet: Checkliste verschwindet dauerhaft (UX-Grundsatz 9).
		if ( $done === count( $steps ) ) {
			return;
		}

		$hans  = Core::instance()->hans();
		$image = $hans->is_enabled() ? $hans->image_url( 30 ) : '';

		echo '<div class="hs-setup">';

		if ( '' !== $image ) {
			echo '<img class="hs-setup__img" src="' . esc_url( $image ) . '" alt="" width="72" height="72" loading="lazy" />';
		}

		echo '<div class="hs-setup__body">';
		echo '<p class="hs-setup__title">' . esc_html__( 'Klar zum Auslaufen', 'leadlotse' ) . '</p>';
		printf(
			'<p class="hs-setup__progress">%s</p>',
			esc_html(
				sprintf(
					/* translators: 1: erledigte Schritte, 2: Gesamtschritte */
					__( '%1$d von %2$d Schritten erledigt', 'leadlotse' ),
					$done,
					count( $steps )
				)
			)
		);

		echo '<ul class="hs-setup__list">';
		foreach ( $steps as $step ) {
			$class = $step['done'] ? 'is-done' : '';
			echo '<li class="hs-setup__item ' . esc_attr( $class ) . '">';
			echo '<span class="hs-setup__check" aria-hidden="true">' . ( $step['done'] ? '&#10003;' : '&#9675;' ) . '</span>';
			if ( ! $step['done'] && '' !== $step['url'] ) {
				echo '<a href="' . esc_url( $step['url'] ) . '">' . esc_html( $step['label'] ) . '</a>';
			} else {
				echo '<span>' . esc_html( $step['label'] ) . '</span>';
			}
			echo '<span class="screen-reader-text">' . ( $step['done'] ? esc_html__( '(erledigt)', 'leadlotse' ) : esc_html__( '(offen)', 'leadlotse' ) ) . '</span>';
			echo '</li>';
		}
		echo '</ul>';

		echo '</div>'; // .hs-setup__body
		echo '</div>'; // .hs-setup
	}

	/**
	 * Berechnet die vier Einrichtungsschritte samt Erledigt-Status.
	 *
	 * @return array<int, array{label:string,done:bool,url:string}>
	 */
	private function steps(): array {
		$published = (int) wp_count_posts( FormPostType::POST_TYPE )->publish;
		$total     = $published + (int) wp_count_posts( FormPostType::POST_TYPE )->draft;
		$has_form  = $total > 0;
		$has_recipient = $this->any_form_has_recipient();
		$has_entry = $this->entries->count_all() > 0;

		return array(
			array(
				'label' => __( 'Erstes Formular erstellen', 'leadlotse' ),
				'done'  => $has_form,
				'url'   => BuilderPage::url( 0 ),
			),
			array(
				'label' => __( 'Formular veroeffentlichen', 'leadlotse' ),
				'done'  => $published > 0,
				'url'   => admin_url( 'admin.php?page=' . Menu::MENU_SLUG ),
			),
			array(
				'label' => __( 'Empfaenger fuer Benachrichtigungen festlegen', 'leadlotse' ),
				'done'  => $has_recipient,
				'url'   => admin_url( 'admin.php?page=' . Menu::MENU_SLUG ),
			),
			array(
				'label' => __( 'Erste Anfrage erhalten', 'leadlotse' ),
				'done'  => $has_entry,
				'url'   => '',
			),
		);
	}

	/**
	 * Hat mindestens ein Formular einen Benachrichtigungsempfaenger?
	 * (Leerer Empfaenger = Fallback auf die Admin-Mail; hier zaehlt nur ein
	 * bewusst gesetzter Empfaenger als erledigt.)
	 *
	 * @return bool
	 */
	private function any_form_has_recipient(): bool {
		$query = new \WP_Query(
			array(
				'post_type'      => FormPostType::POST_TYPE,
				'post_status'    => array( 'publish', 'draft' ),
				'posts_per_page' => 50,
				'fields'         => 'ids',
				'no_found_rows'  => true,
			)
		);
		foreach ( $query->posts as $form_id ) {
			$definition = FormPostType::get_definition( (int) $form_id );
			$recipients = $definition['settings']['recipients'] ?? array();
			if ( is_array( $recipients ) && array() !== $recipients ) {
				return true;
			}
		}
		return false;
	}
}
