<?php
declare(strict_types=1);

namespace OCA\GPodderSync\Controller;

use DateTime;
use OCA\GPodderSync\Core\SubscriptionChange\SubscriptionChangeSaver;
use OCA\GPodderSync\Db\SubscriptionChange\SubscriptionChangeEntity;
use OCA\GPodderSync\Db\SubscriptionChange\SubscriptionChangeRepository;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\JSONResponse;
use OCP\IRequest;

class SubscriptionChangeController extends Controller {

	private string $AppName;
	/**
	 * @var SubscriptionChangeSaver
	 */
	private SubscriptionChangeSaver $subscriptionChangeSaver;
	/**
	 * @var SubscriptionChangeRepository
	 */
	private SubscriptionChangeRepository $subscriptionChangeRepository;
	private $userId;

	public function __construct(
		string $AppName,
		IRequest $request,
		$UserId,
		SubscriptionChangeSaver $subscriptionChangeSaver,
		SubscriptionChangeRepository $subscriptionChangeRepository

	) {
		parent::__construct($AppName, $request);
		$this->subscriptionChangeSaver = $subscriptionChangeSaver;
		$this->subscriptionChangeRepository = $subscriptionChangeRepository;
		$this->userId = $UserId;
	}

	/**
	 *
	 * @NoAdminRequired
	 * @NoCSRFRequired
	 *
	 * @return void
	 */
	public function create($add, $remove) {
		return $this->subscriptionChangeSaver->saveSubscriptionChanges($add, $remove, $this->userId);
	}

	/**
	 *
	 * @NoAdminRequired
	 * @NoCSRFRequired
	 *
	 * @param int $since
	 * @return JSONResponse
	 * @throws \Exception
	 */
	public function list(int $since = null): JSONResponse {
		$sinceDatetime = $this->createDateTimeFromTimestamp($since);
		return new JSONResponse([
			"add" => $this->extractUrlList($this->subscriptionChangeRepository->findAllSubscribed($sinceDatetime, $this->userId)),
			"remove" => $this->extractUrlList($this->subscriptionChangeRepository->findAllUnSubscribed($sinceDatetime, $this->userId)),
			"timestamp" => time()
		]);
	}

	/**
	 * @param int|null $since
	 *
	 * @return DateTime
	 */
	private function createDateTimeFromTimestamp(?int $since): DateTime {
		return ($since)
			? (new \DateTime)->setTimestamp($since)
			: (new \DateTime('-1 week'));
	}

	/**
	 * @param array $allSubscribed
	 *
	 * @return mixed
	 */
	private function extractUrlList(array $allSubscribed): array {
		return array_map(function (SubscriptionChangeEntity $subscription) {
			return $subscription->getUrl();
		}, $allSubscribed);
	}
}