<?php
declare(strict_types=1);

namespace OCA\GPodderSync\Core\SubscriptionChange;

use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
use OCA\GPodderSync\Db\SubscriptionChange\SubscriptionChangeEntity;
use OCA\GPodderSync\Db\SubscriptionChange\SubscriptionChangeRepository;
use OCA\GPodderSync\Db\SubscriptionChange\SubscriptionChangeWriter;

class SubscriptionChangeSaver {

	/**
	 * @var SubscriptionChangesReader
	 */
	private SubscriptionChangesReader $subscriptionChangeReader;
	/**
	 * @var SubscriptionChangeRepository
	 */
	private SubscriptionChangeRepository $subscriptionChangeRepository;
	/**
	 * @var SubscriptionChangeWriter
	 */
	private SubscriptionChangeWriter $subscriptionChangeWriter;
	/**
	 * @var SubscriptionChangeRequestParser
	 */
	private SubscriptionChangeRequestParser $subscriptionChangeRequestParser;

	public function __construct(
		SubscriptionChangeRequestParser $subscriptionChangeRequestParser,
		SubscriptionChangeRepository $subscriptionChangeRepository,
		SubscriptionChangeWriter $subscriptionChangeWriter
	) {
		$this->subscriptionChangeRepository = $subscriptionChangeRepository;
		$this->subscriptionChangeWriter = $subscriptionChangeWriter;
		$this->subscriptionChangeRequestParser = $subscriptionChangeRequestParser;
	}

	public function saveSubscriptionChanges(string $urlsSubscribed, string $urlsUnsubscribed, string $userId) : void {
		$subscriptionChanges = $this->subscriptionChangeRequestParser->createSubscriptionChangeList($urlsSubscribed, $urlsUnsubscribed);
		foreach ($subscriptionChanges as $urlChangedSubscriptionStatus) {
			$subscriptionChangeEntity = new SubscriptionChangeEntity();
			$subscriptionChangeEntity->setUrl($urlChangedSubscriptionStatus->getUrl());
			$subscriptionChangeEntity->setSubscribed($urlChangedSubscriptionStatus->isSubscribed());
			$subscriptionChangeEntity->setUpdated((new \DateTime())->format("Y-m-d\TH:i:s"));
			$subscriptionChangeEntity->setUserId($userId);

			try {
				$this->subscriptionChangeWriter->create($subscriptionChangeEntity);
			} catch (UniqueConstraintViolationException $ex) {
				$idEpisodeActionEntityToUpdate = $this->subscriptionChangeRepository->findByUrl($subscriptionChangeEntity->getUrl(), $userId)->getId();
				$subscriptionChangeEntity->setId($idEpisodeActionEntityToUpdate);
				$this->subscriptionChangeWriter->update($subscriptionChangeEntity);
			}
		}
	}


}