<?php

declare(strict_types=1);

namespace App\Module\Integration\Infrastructure\ApiPlatform\State;

use ApiPlatform\Metadata\Delete;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\Metadata\Post;
use ApiPlatform\State\ProviderInterface;
use App\Module\Integration\Domain\Entity\TaskBookStackLink;
use App\Module\Integration\Domain\Repository\TaskBookStackLinkRepositoryInterface;
use App\Module\Integration\Infrastructure\ApiPlatform\Resource\BookStackLink;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

final readonly class BookStackLinkProvider implements ProviderInterface
{
    public function __construct(
        private TaskBookStackLinkRepositoryInterface $linkRepository,
    ) {}

    public function provide(Operation $operation, array $uriVariables = [], array $context = []): array|BookStackLink
    {
        if ($operation instanceof Post) {
            return new BookStackLink();
        }

        if ($operation instanceof Delete) {
            $link = $this->linkRepository->find($uriVariables['id'] ?? 0);
            if (null === $link) {
                throw new NotFoundHttpException('Link not found.');
            }
            $dto     = new BookStackLink();
            $dto->id = $link->getId();

            return $dto;
        }

        $taskId = $uriVariables['taskId'] ?? 0;
        $links  = $this->linkRepository->findByTaskId($taskId);

        return array_map(static function (TaskBookStackLink $link): BookStackLink {
            $dto                = new BookStackLink();
            $dto->id            = $link->getId();
            $dto->bookstackId   = $link->getBookstackId();
            $dto->bookstackType = $link->getBookstackType();
            $dto->title         = $link->getTitle();
            $dto->url           = $link->getUrl();
            $dto->createdAt     = $link->getCreatedAt()->format('c');

            return $dto;
        }, $links);
    }
}
