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

namespace Hafenstudios\Leadlotse\Install;

use Hafenstudios\Core\Consent\ConsentLog;
use Hafenstudios\Core\Db\Migrator;
use Hafenstudios\Core\Support\Capabilities;
use Hafenstudios\Leadlotse\Db\EntryRepository;
use Hafenstudios\Leadlotse\Forms\FormPostType;

defined( 'ABSPATH' ) || exit;

/**
 * Aktivierung, Deaktivierung und (vorbereitete) Deinstallation.
 *
 * Aktivierung: Migrationen ueber den Core-Migrator (hs_entries), Consent-Tabelle
 * des Core (hs_consents, D6), Capabilities und Rolle hs_lead_agent (D12),
 * Default-Einstellungen, taeglicher Wartungs-Cron.
 * Deaktivierung: nur Cron und Rewrites aufraeumen, Daten bleiben erhalten.
 * Deinstallation: loescht Daten NUR, wenn das Setting "Daten bei Deinstallation
 * loeschen" aktiv ist (Default aus, Definition of Done Punkt 5).
 */
final class Installer {

	public const CRON_HOOK = 'leadlotse_daily_maintenance';

	public const SETTINGS_OPTION = 'hs_leadlotse_settings';

	/**
	 * Default-Einstellungen des Plugins (Basis fuer den Core-Settings-Speicher).
	 *
	 * @return array<string, mixed>
	 */
	public static function default_settings(): array {
		return array(
			'address_form'  => 'sie', // "sie" oder "du".
			'sender'        => array(
				'from_name'  => '',
				'from_email' => '',
			),
			'notifications' => array(
				'enabled'    => true,
				'recipients' => array(), // Leer = Admin-Mail der Site.
			),
			'spam'          => array(
				'honeypot'    => true,
				'min_seconds' => 3,
				'rate_limit'  => array(
					'max'    => 5,
					'window' => 600,
				),
			),
			'doi'           => array(
				'expiry_hours' => 48,
			),
			'frontend'      => array(
				'load_css' => true, // Schlankes Frontend-CSS, abschaltbar (Etappe 3).
			),
			'privacy'       => array(
				'page_id'             => 0, // Wird bei Aktivierung aus WP uebernommen.
				'delete_on_uninstall' => false,
				'retention_months'    => 0, // 0 = keine automatische Loeschung.
			),
			'identity'      => array(
				// Ausfuellhilfe "Weiter mit Google/Apple". Geheimnisse verschluesselt.
				'google' => array(
					'enabled'       => false,
					'client_id'     => '',
					'client_secret' => '',
				),
				'apple'  => array(
					'enabled'     => false,
					'client_id'   => '',
					'team_id'     => '',
					'key_id'      => '',
					'private_key' => '',
				),
			),
		);
	}

	/**
	 * Plugin-Aktivierung.
	 *
	 * @return void
	 */
	public static function activate(): void {
		// Capabilities und Rolle hs_lead_agent (D12).
		Capabilities::install();

		// Consent-Tabelle des Core (D6).
		ConsentLog::install();

		// Eigene Tabellen ueber den Core-Migrator.
		self::migrate();

		// Default-Einstellungen nur setzen, wenn noch keine existieren.
		if ( false === get_option( self::SETTINGS_OPTION, false ) ) {
			$defaults                       = self::default_settings();
			$defaults['privacy']['page_id'] = (int) get_option( 'wp_page_for_privacy_policy', 0 );
			add_option( self::SETTINGS_OPTION, $defaults );
		}

		// CPT registrieren, damit die Rewrite-Regeln stimmen.
		( new FormPostType() )->register();
		flush_rewrite_rules();

		// Taegliche Wartung (z.B. abgelaufene, unbestaetigte DOI-Anmeldungen).
		if ( ! wp_next_scheduled( self::CRON_HOOK ) ) {
			wp_schedule_event( time() + HOUR_IN_SECONDS, 'daily', self::CRON_HOOK );
		}

		// Merker fuer das Onboarding (Etappe 5): frisch installiert.
		if ( false === get_option( 'leadlotse_activated_at', false ) ) {
			update_option( 'leadlotse_activated_at', time() );
			update_option( 'leadlotse_needs_onboarding', 1 );
		}
	}

	/**
	 * Fuehrt die Datenbank-Migrationen aus (auch bei Updates aufrufbar).
	 *
	 * @return void
	 */
	public static function migrate(): void {
		$migrator = new Migrator( 'leadlotse', EntryRepository::DB_VERSION );
		EntryRepository::register_migrations( $migrator );
		$migrator->run();
	}

	/**
	 * Plugin-Deaktivierung: Cron und Rewrites aufraeumen, Daten bleiben erhalten.
	 *
	 * @return void
	 */
	public static function deactivate(): void {
		wp_clear_scheduled_hook( self::CRON_HOOK );
		flush_rewrite_rules();
	}

	/**
	 * Deinstallation (Aufruf aus uninstall.php). Loescht Daten nur, wenn das
	 * Setting privacy.delete_on_uninstall aktiv ist (Default aus).
	 *
	 * @return void
	 */
	public static function uninstall(): void {
		$settings = get_option( self::SETTINGS_OPTION, array() );
		$settings = is_array( $settings ) ? $settings : array();

		if ( empty( $settings['privacy']['delete_on_uninstall'] ) ) {
			return;
		}

		// Formulare (CPT) und ihre Meta loeschen.
		$form_ids = get_posts(
			array(
				'post_type'      => FormPostType::POST_TYPE,
				'post_status'    => 'any',
				'posts_per_page' => -1,
				'fields'         => 'ids',
			)
		);
		foreach ( $form_ids as $form_id ) {
			wp_delete_post( (int) $form_id, true );
		}

		// Entries-Tabelle und Schemaversion entfernen.
		EntryRepository::drop();
		( new Migrator( 'leadlotse', EntryRepository::DB_VERSION ) )->reset();

		// Optionen dieses Namespaces.
		delete_option( self::SETTINGS_OPTION );
		delete_option( 'hs_leadlotse_logging' );
		delete_option( 'leadlotse_activated_at' );
		delete_option( 'leadlotse_needs_onboarding' );
		delete_option( 'leadlotse_checklist' );

		// Capabilities/Rolle nur entfernen, wenn kein anderes Flotten-Plugin aktiv ist.
		if ( ! defined( 'KURATO_VERSION' ) ) {
			Capabilities::uninstall();
		}
	}
}
