<?php
/**
 * Update handler file.
 *
 * @package Activitypub
 */

namespace Activitypub\Handler;

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 $activity The activity-object.
	 */
	public static function handle_update( $activity ) {
		$object_type = isset( $activity['object']['type'] ) ? $activity['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( $activity );
				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( $activity );
				break;

			/*
			 * Minimal Activity.
			 *
			 * @see https://www.w3.org/TR/activitystreams-core/#example-1
			 */
			default:
				break;
		}
	}

	/**
	 * Update an Interaction.
	 *
	 * @param array $activity The activity-object.
	 */
	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.
	 */
	public static function update_actor( $activity ) {
		// Update cache.
		get_remote_metadata_by_actor( $activity['actor'], false );

		// @todo maybe also update all interactions.
	}
}