<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.

namespace Yoast\WP\SEO\MyYoast_Client\Application;

use Exception;
use Yoast\WP\SEO\MyYoast_Client\Application\Ports\Client_Registration_Interface;
use Yoast\WP\SEO\MyYoast_Client\Application\Ports\Token_Storage_Interface;
use Yoast\WP\SEO\MyYoast_Client\Application\Ports\User_Token_Storage_Interface;
use YoastSEO_Vendor\Psr\Log\LoggerAwareInterface;
use YoastSEO_Vendor\Psr\Log\LoggerAwareTrait;
use YoastSEO_Vendor\Psr\Log\NullLogger;

/**
 * Application service for cleaning up all MyYoast client data.
 *
 * Orchestrates deregistration, token deletion, and local data cleanup.
 * Used by the uninstall integration to cleanly remove all plugin state.
 */
class MyYoast_Client_Cleanup implements LoggerAwareInterface {
	use LoggerAwareTrait;

	/**
	 * The client registration port.
	 *
	 * @var Client_Registration_Interface
	 */
	private $client_registration;

	/**
	 * The site-level token storage port.
	 *
	 * @var Token_Storage_Interface
	 */
	private $token_storage;

	/**
	 * The user-level token storage port.
	 *
	 * @var User_Token_Storage_Interface
	 */
	private $user_token_storage;

	/**
	 * MyYoast_Client_Cleanup constructor.
	 *
	 * @param Client_Registration_Interface $client_registration The client registration port.
	 * @param Token_Storage_Interface       $token_storage       The site-level token storage port.
	 * @param User_Token_Storage_Interface  $user_token_storage  The user-level token storage port.
	 */
	public function __construct(
		Client_Registration_Interface $client_registration,
		Token_Storage_Interface $token_storage,
		User_Token_Storage_Interface $user_token_storage
	) {
		$this->client_registration = $client_registration;
		$this->token_storage       = $token_storage;
		$this->user_token_storage  = $user_token_storage;
		$this->logger              = new NullLogger();
	}

	/**
	 * Executes the full cleanup: deregister, delete tokens, delete local data.
	 *
	 * @return void
	 */
	public function execute(): void {
		// Best-effort server-side deregistration.
		try {
			$this->client_registration->deregister();
		}
		catch ( Exception $e ) {
			$this->logger->warning( 'MyYoast client deregistration failed during cleanup: {error}', [ 'error' => $e->getMessage() ] );
		}

		$this->user_token_storage->delete_all_issuers();
		$this->token_storage->delete_all_issuers();
		$this->client_registration->delete_local_data();
	}
}
