<?php

declare(strict_types=1);

namespace OCA\RePod\Core\EpisodeAction;

use OCA\GPodderSync\Core\EpisodeAction\EpisodeAction;

/**
 * https://github.com/pbek/nextcloud-nextpod/blob/main/lib/Core/EpisodeAction/EpisodeActionExtraData.php.
 *
 * @psalm-import-type EpisodeActionType from EpisodeAction
 *
 * @psalm-type EpisodeActionExtraDataType = array{
 *  episodeUrl: ?string,
 *  podcastName: ?string,
 *  episodeName: ?string,
 *  episodeLink: ?string,
 *  episodeImage: ?string,
 *  episodeDescription: ?string,
 *  fetchedAtUnix: int,
 * 	episodePubDate: ?\DateTime,
 * 	episodeFilesize: ?int,
 * 	episodeDuration: ?int,
 *  episodeAction: ?EpisodeActionType
 * }
 */
class EpisodeActionExtraData implements \JsonSerializable
{
	public function __construct(
		private ?string $episodeUrl,
		private ?string $podcastName,
		private ?string $episodeName,
		private ?string $episodeLink,
		private ?string $episodeImage,
		private ?string $episodeDescription,
		private int $fetchedAtUnix,
		private ?\DateTime $episodePubDate,
		private ?int $episodeFilesize,
		private ?int $episodeDuration,
		private ?EpisodeAction $episodeAction
	) {
		$this->episodeUrl = $episodeUrl;
		$this->podcastName = $podcastName;
		$this->episodeName = $episodeName;
		$this->episodeLink = $episodeLink;
		$this->episodeImage = $episodeImage;
		$this->episodeDescription = $episodeDescription;
		$this->fetchedAtUnix = $fetchedAtUnix;
		$this->episodePubDate = $episodePubDate;
		$this->episodeFilesize = $episodeFilesize;
		$this->episodeDuration = $episodeDuration;
		$this->episodeAction = $episodeAction;
	}

	public function __toString(): string
	{
		return $this->episodeUrl ?? '/no episodeUrl/';
	}

	public function getEpisodePubDate(): ?\DateTime
	{
		return $this->episodePubDate;
	}

	public function getEpisodeFilesize(): ?int
	{
		return $this->episodeFilesize;
	}

	public function getEpisodeDuration(): ?int
	{
		return $this->episodeDuration;
	}

	public function getEpisodeAction(): ?EpisodeAction
	{
		return $this->episodeAction;
	}

	public function getEpisodeUrl(): ?string
	{
		return $this->episodeUrl;
	}

	/**
	 * @return EpisodeActionExtraDataType
	 */
	public function toArray(): array
	{
		return
		[
			'podcastName' => $this->podcastName,
			'episodeUrl' => $this->episodeUrl,
			'episodeName' => $this->episodeName,
			'episodeLink' => $this->episodeLink,
			'episodeImage' => $this->episodeImage,
			'episodeDescription' => $this->episodeDescription,
			'fetchedAtUnix' => $this->fetchedAtUnix,
			'episodePubDate' => $this->episodePubDate,
			'episodeFilesize' => $this->episodeFilesize,
			'episodeDuration' => $this->episodeDuration,
			'episodeAction' => $this->episodeAction ? $this->episodeAction->toArray() : null,
		];
	}

	/**
	 * @return EpisodeActionExtraDataType
	 */
	public function jsonSerialize(): mixed
	{
		return $this->toArray();
	}

	public function getPodcastName(): ?string
	{
		return $this->podcastName;
	}

	public function getEpisodeName(): ?string
	{
		return $this->episodeName;
	}

	public function getEpisodeLink(): ?string
	{
		return $this->episodeLink;
	}

	public function getFetchedAtUnix(): int
	{
		return $this->fetchedAtUnix;
	}

	public function getEpisodeImage(): ?string
	{
		return $this->episodeImage;
	}
}