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

namespace Hafenstudios\Kurato\Cockpit;

defined( 'ABSPATH' ) || exit;

/**
 * Wendet eine agents/sync-Meldung des Dienstes an: Agent anlegen, aendern oder
 * sperren. Idempotent ueber die agent_id (COCKPIT-API.md, Connector-API).
 *
 * Reine Orchestrierung; die WordPress-Nutzerarbeit steckt hinter ShadowUserStore.
 */
class AgentSync {

	private ShadowUserStore $store;

	/**
	 * @param ShadowUserStore $store Schattennutzer-Seam.
	 */
	public function __construct( ShadowUserStore $store ) {
		$this->store = $store;
	}

	/**
	 * Wendet eine Agent-Meldung an.
	 *
	 * @param string               $agent_id Agent-ID (Schluessel der Idempotenz).
	 * @param array<string, mixed> $data     email, name, status (active|disabled).
	 * @return array<string, mixed> ok, wp_user_id, created oder error.
	 */
	public function apply( string $agent_id, array $data ): array {
		$agent_id = trim( $agent_id );
		if ( '' === $agent_id ) {
			return array(
				'ok'    => false,
				'error' => 'invalid_agent',
			);
		}

		$status = ( 'disabled' === ( $data['status'] ?? 'active' ) ) ? 'disabled' : 'active';
		$email  = (string) ( $data['email'] ?? '' );
		$name   = (string) ( $data['name'] ?? '' );

		$existing = $this->store->find_by_agent( $agent_id );

		if ( null !== $existing ) {
			$this->store->update( $existing, $email, $name );
			$this->store->set_active( $existing, 'active' === $status );
			return array(
				'ok'         => true,
				'wp_user_id' => $existing,
				'created'    => false,
			);
		}

		// Kein Schattennutzer vorhanden. Eine Sperr-Meldung fuer einen
		// unbekannten Agent ist ein Noop (idempotent - nichts anzulegen).
		if ( 'disabled' === $status ) {
			return array(
				'ok'         => true,
				'wp_user_id' => 0,
				'created'    => false,
			);
		}

		$id = $this->store->create( $agent_id, $email, $name );
		return array(
			'ok'         => true,
			'wp_user_id' => $id,
			'created'    => $id > 0,
		);
	}
}
