<?php
namespace Activitypub\Handler;

use WP_Error;
use Activitypub\Collection\Interactions;

use function Activitypub\get_remote_metadata_by_actor;

/**
 * Handle Update requests.
 */
class Update {
	/**
	 * Initialize the class, registering WordPress hooks
	 */
	public static function init() {
		\add_action(
			'activitypub_inbox_update',
			array( self::class, 'handle_update' )
		);
	}

	/**
	 * Handle "Update" requests
	 *
	 * @param array                $array   The activity-object
	 * @param int                  $user_id The id of the local blog-user
	 */
	public static function handle_update( $array ) {
		$object_type = isset( $array['object']['type'] ) ? $array['object']['type'] : '';

		switch ( $object_type ) {
			// Actor Types
			// @see https://www.w3.org/TR/activitystreams-vocabulary/#actor-types
			case 'Person':
			case 'Group':
			case 'Organization':
			case 'Service':
			case 'Application':
				self::update_actor( $array );
				break;
			// Object and Link Types
			// @see https://www.w3.org/TR/activitystreams-vocabulary/#object-types
			case 'Note':
			case 'Article':
			case 'Image':
			case 'Audio':
			case 'Video':
			case 'Event':
			case 'Document':
				self::update_interaction( $array );
				break;
			// Minimal Activity
			// @see https://www.w3.org/TR/activitystreams-core/#example-1
			default:
				break;
		}
	}

	/**
	 * Update an Interaction
	 *
	 * @param array $activity The activity-object
	 * @param int   $user_id  The id of the local blog-user
	 *
	 * @return void
	 */
	public static function update_interaction( $activity ) {
		$commentdata = Interactions::update_comment( $activity );
		$reaction    = null;

		if ( ! empty( $commentdata['comment_ID'] ) ) {
			$state    = 1;
			$reaction = \get_comment( $commentdata['comment_ID'] );
		} else {
			$state = $commentdata;
		}

		\do_action( 'activitypub_handled_update', $activity, null, $state, $reaction );
	}

	/**
	 * Update an Actor
	 *
	 * @param array $activity The activity-object
	 *
	 * @return void
	 */
	public static function update_actor( $activity ) {
		// update cache
		get_remote_metadata_by_actor( $activity['actor'], false );

		// @todo maybe also update all interactions
	}
}