<?php
declare(strict_types=1);

namespace OCA\GPodderSync\Core\EpisodeAction;

class EpisodeActionReader
{

	const EPISODEACTION_IDENTIFIER = 'EpisodeAction{';

	/**
	 * @param string $episodeActionsString
	 * @return EpisodeAction[]
	 */
	public function fromString(string $episodeActionsString): array
	{


		$patterns = [
			'/EpisodeAction{(podcast=\')(?<podcast>.*?)(\', episode=\')(?<episode>.*?)(\', guid=\')(?<guid>.*?)(\', action=)(?<action>.*?)(, timestamp=)(?<timestamp>.*?)(, started=)(?<started>.*?)(, position=)(?<position>.*?)(, total=)(?<total>.*?)}]*/',
			'/EpisodeAction{(podcast=\')(?<podcast>.*?)(\', episode=\')(?<episode>.*?)(\', action=)(?<action>.*?)(, timestamp=)(?<timestamp>.*?)(, started=)(?<started>.*?)(, position=)(?<position>.*?)(, total=)(?<total>.*?)}]*/',
		];

		$episodeActions = [];

		$episodeActionStrings = explode(self::EPISODEACTION_IDENTIFIER, $episodeActionsString);
		array_shift($episodeActionStrings);

		foreach ($episodeActionStrings as $episodeActionString) {
			foreach ($patterns as $pattern) {
				preg_match(
					$pattern,
					self::EPISODEACTION_IDENTIFIER . $episodeActionString,
					$matches
				);

				if ($matches["action"] !== null) {
					$episodeActions[] = new EpisodeAction(
						$matches["podcast"],
						$matches["episode"],
						$matches["action"],
						$matches["timestamp"],
						(int)$matches["started"],
						(int)$matches["position"],
						(int)$matches["total"],
						$matches["guid"] ?? null,
						null,
					);
					break;
				}
			}

		}
		return $episodeActions;
	}
}