<?php

namespace App\Library\Action\Handler;

use App\Base\Service\MediaFiles;
use App\Download\Action\Result\DeleteMediaFileResult;
use App\Download\Framework\Entity\Download;
use App\Download\Framework\Repository\DownloadRepository;
use App\Library\Action\Command\DeleteMediaFileCommand;
use OneToMany\RichBundle\Contract\CommandInterface;
use OneToMany\RichBundle\Contract\HandlerInterface;
use OneToMany\RichBundle\Contract\ResultInterface;

/**
 * @implements HandlerInterface<DeleteMediaFileCommand,DeleteMediaFileResult>
 */
class DeleteMediaFileHandler implements HandlerInterface
{
    public function __construct(
        private readonly DownloadRepository $downloadRepository,
        private readonly MediaFiles $mediaFiles,
    ) {}

    public function handle(CommandInterface $command): ResultInterface
    {
        /** @var Download $downloadRecord */
        $downloadRecord = $this->downloadRepository->find($command->downloadId);
        $filepath = $this->getFullFilepath($downloadRecord);
        $result = $this->mediaFiles->removeFile($filepath);

        return new DeleteMediaFileResult(
            message: true === $result ? 'File removed' : 'File not removed',
            filepath: $filepath,
            isDeleted: $result
        );
    }

    private function getFullFilepath(Download $download): string
    {
        return $this->mediaFiles->getPathByType($download->getMediaType()) . DIRECTORY_SEPARATOR . $download->getFilename();
    }
}
