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

namespace Hafenstudios\Core\Support;

defined( 'ABSPATH' ) || exit;

/**
 * Definiert und verwaltet die granularen Flotten-Capabilities.
 *
 * Die eigentliche Zuweisung an Rollen passiert bei der Plugin-Aktivierung
 * (siehe Plugin-Aktivierungshooks), damit sie auch ohne aktiven Core sauber
 * greift. Diese Klasse liefert die Definitionen und Helfer.
 */
final class Capabilities {

	private static ?Capabilities $instance = null;

	/**
	 * Kern-Capabilities der Flotte -> menschliche Beschreibung.
	 *
	 * @var array<string, string>
	 */
	private const CAPS = array(
		'hs_manage_forms'    => 'Formulare erstellen und bearbeiten',
		'hs_view_entries'    => 'Anfragen ansehen und bearbeiten',
		'hs_manage_settings' => 'Einstellungen der Flotte verwalten',
		'hs_view_contacts'   => 'Kontakte ansehen',
		'hs_manage_contacts' => 'Kontakte und Pipeline verwalten',
		'hs_send_mails'      => 'Newsletter und Mails senden',
		'hs_manage_spam'     => 'Spam-Schutz verwalten',
	);

	private function __construct() {}

	public static function instance(): Capabilities {
		return self::$instance ??= new self();
	}

	public function boot(): void {
		// Reserviert fuer spaetere dynamische Cap-Filter. Aktuell nichts noetig.
	}

	/**
	 * Liefert alle Kern-Capabilities.
	 *
	 * @return array<string, string>
	 */
	public static function all(): array {
		return self::CAPS;
	}

	/**
	 * Weist den Standardrollen die Flotten-Capabilities zu und legt die
	 * Buero-Rolle "Lead-Bearbeiter" an. Aufruf bei Plugin-Aktivierung.
	 *
	 * @return void
	 */
	public static function install(): void {
		$admin = get_role( 'administrator' );
		if ( $admin ) {
			foreach ( array_keys( self::CAPS ) as $cap ) {
				$admin->add_cap( $cap );
			}
		}

		// Persona Jonas: darf Anfragen und Kontakte sehen und bearbeiten, keine
		// Einstellungen. Idempotent: bei bestehender Rolle die Caps ergaenzen,
		// damit Bestandsinstallationen die neuen Kontakt-Rechte nachtragen.
		$agent = get_role( 'hs_lead_agent' );
		if ( ! $agent ) {
			add_role(
				'hs_lead_agent',
				__( 'Lead-Bearbeiter', 'hafenstudios-core' ),
				array(
					'read'            => true,
					'hs_view_entries' => true,
					'hs_view_contacts' => true,
				)
			);
		} else {
			$agent->add_cap( 'hs_view_contacts' );
		}
	}

	/**
	 * Entfernt die Capabilities wieder (nur bei vollstaendiger Deinstallation
	 * mit aktivierter Datenloeschung; nicht bei blosser Deaktivierung).
	 *
	 * @return void
	 */
	public static function uninstall(): void {
		$admin = get_role( 'administrator' );
		if ( $admin ) {
			foreach ( array_keys( self::CAPS ) as $cap ) {
				$admin->remove_cap( $cap );
			}
		}
		remove_role( 'hs_lead_agent' );
	}
}
