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

namespace Activitypub\Handler;

use Activitypub\Comment;
use Activitypub\Collection\Interactions;

use function Activitypub\object_to_uri;

/**
 * Handle Like requests.
 */
class Like {
	/**
	 * Initialize the class, registering WordPress hooks.
	 */
	public static function init() {
		\add_action( 'activitypub_inbox_like', array( self::class, 'handle_like' ), 10, 2 );
		\add_filter( 'activitypub_get_outbox_activity', array( self::class, 'outbox_activity' ) );
	}

	/**
	 * Handles "Like" requests.
	 *
	 * @param array $like    The Activity array.
	 * @param int   $user_id The ID of the local blog user.
	 */
	public static function handle_like( $like, $user_id ) {
		if ( ! Comment::is_comment_type_enabled( 'like' ) ) {
			return;
		}

		$url = object_to_uri( $like['object'] );

		if ( empty( $url ) ) {
			return;
		}

		$exists = Comment::object_id_to_comment( esc_url_raw( $url ) );
		if ( $exists ) {
			return;
		}

		$state    = Interactions::add_reaction( $like );
		$reaction = null;

		if ( $state && ! is_wp_error( $state ) ) {
			$reaction = get_comment( $state );
		}

		/**
		 * Fires after a Like has been handled.
		 *
		 * @param array $like     The Activity array.
		 * @param int   $user_id  The ID of the local blog user.
		 * @param mixed $state    The state of the reaction.
		 * @param mixed $reaction The reaction object.
		 */
		do_action( 'activitypub_handled_like', $like, $user_id, $state, $reaction );
	}

	/**
	 * Set the object to the object ID.
	 *
	 * @param \Activitypub\Activity\Activity $activity The Activity object.
	 * @return \Activitypub\Activity\Activity The filtered Activity object.
	 */
	public static function outbox_activity( $activity ) {
		if ( 'Like' === $activity->get_type() ) {
			$activity->set_object( object_to_uri( $activity->get_object() ) );
		}

		return $activity;
	}
}