<?php
/**
 * ActivityPub Transformer for VS Event.
 *
 * @package activity-event-transformers
 * @license AGPL-3.0-or-later
 */

require_once __DIR__ . '/../object/class-event.php';

use Activitypub\Activity\Base_Object;
use Place;
use function Activitypub\get_rest_url_by_path;

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * ActivityPub Transformer for VS Event
 *
 * @since 1.0.0
 */
class VS_Event extends \Activitypub\Transformer\Base {
	/**
	 * Get widget name.
	 *
	 * Retrieve oEmbed widget name.
	 *
	 * @since 1.0.0
	 * @access public
	 * @return string Widget name.
	 */
	public function get_name() {
		return 'activitypub-event-transformers/vs-event';
	}

	/**
	 * Get widget title.
	 *
	 * Retrieve Transformer title.
	 *
	 * @since 1.0.0
	 * @access public
	 * @return string Widget title.
	 */
	public function get_label() {
		return 'VS Event';
	}

	/**
	 * Returns the ActivityStreams 2.0 Object-Type for an Event.
	 *
	 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-event
	 * @since 1.0.0
	 * @return string The Event Object-Type.
	 */
	protected function get_object_type() {
		return 'Event';
	}

	/**
	 * Get supported post types.
	 *
	 * Retrieve the list of supported WordPress post types this transformer widget can handle.
	 *
	 * @since 1.0.0
	 * @access public
	 * @return array Widget categories.
	 */
	public static function get_supported_post_types() {
		return array( 'event' );
	}

	/**
	 * Get the event location.
	 *
	 * @param int $post_id The WordPress post ID.
	 * @returns array The Place.
	 */
	public function get_event_location( $post_id ) {
		$address = get_post_meta( $post_id, 'event-location', true );
		return ( new Place() )
			->set_type( 'Place' )
			->set_name( $address )
			->set_address( $address );
	}

	/**
	 * Get the end time from the events metadata.
	 */
	private function get_end_time() {
		$end_time = get_post_meta( $this->wp_post->ID, 'event-date', true );
		return \gmdate( 'Y-m-d\TH:i:s\Z', $end_time );
	}

	/**
	 * Get the event link from the events metadata.
	 */
	private function get_event_link() {
		$event_link = get_post_meta( $this->wp_post->ID, 'event-link', true );
		if ( $event_link ) {
			return [
				'type' => 'Link',
				'name' => 'Website',
				'href' => \esc_url( get_post_meta( $post_id, 'event-location', true ) ),
				'mediaType' => 'text/html',
			];
		}
	}

	/**
	 * Overrides/extends the get_attachments function to also add the event Link.
	 */
	protected function get_attachments() {
		$attachments = parent::get_attachments();
		$event_link = $this->get_event_link();
		if ( $event_link ) {
			$attachments[] = $this->get_event_link();
		}
		return $attachments;
	}

	private function get_category() {
		return 'MEETING';
	}

	/**
	 * Transforms the VS Event WP_Post object to an ActivityPub Event Object.
	 *
	 * @see \Activitypub\Activity\Base_Object
	 *
	 * @return \Activitypub\Activity\Base_Object The ActivityPub Object.
	 */
	public function transform() {
		$context = Event::get_context();
		$object  = new Event();
		$object
			->set_id( $this->get_id() )
			->set_url( $this->get_url() )
			->set_type( $this->get_object_type() );

		$published = \strtotime( $this->wp_post->post_date_gmt );

		$object->set_published( \gmdate( 'Y-m-d\TH:i:s\Z', $published ) );

		$updated = \strtotime( $this->wp_post->post_modified_gmt );

		if ( $updated > $published ) {
			$object->set_updated( \gmdate( 'Y-m-d\TH:i:s\Z', $updated ) );
		}

		$object
			->set_attributed_to( $this->get_attributed_to() )
			->set_content( $this->get_content() )
			->set_content_map( $this->get_content_map );

		$summary = get_post_meta( $this->wp_post->ID, 'event-summary', true );
		if ( $summary ) {
			$object->set_summary( $summary );
		} else {
			$object->set_summary( $this->content );
		}

		$start_time = get_post_meta( $this->wp_post->ID, 'event-start-date', true );
		$object->set_start_time( \gmdate( 'Y-m-d\TH:i:s\Z', $start_time ) );

		$hide_end_time = get_post_meta( $this->wp_post->ID, 'event-hide-end-time', true);

		if ( $hide_end_time != 'yes' ) {
			$object->set_end_time( $this->get_end_time() );
		}

		$path = sprintf( 'users/%d/followers', intval( $this->wp_post->post_author ) );

		$object
			->set_location( $this->get_event_location( $this->wp_post->ID )->to_array() )
			->set_comments_enabled( comments_open( $this->wp_post->ID ) )
			->set_to(
				array(
					'https://www.w3.org/ns/activitystreams#Public',
					get_rest_url_by_path( $path ),
				)
			)
			->set_cc( $this->get_cc() )
			->set_attachment( $this->get_attachments() )
			->set_tag( $this->get_tags() )
			->set_replies_moderation_option( 'allow_all' )
			->set_join_mode( 'external' )
			->set_external_participation_url( $this->get_url() )
			->set_status( 'CONFIRMED' )
			->set_category( 'MEETING' );

		return $object;
	}
}