<?php

namespace App\Services;

use App\Models\RadioStation;
use App\Models\User;
use App\Repositories\RadioStationRepository;
use App\Values\Radio\RadioStationCreateData;
use App\Values\Radio\RadioStationUpdateData;

class RadioService
{
    public function __construct(
        private readonly RadioStationRepository $repository,
        private readonly ImageStorage $imageStorage,
    ) {
    }

    public function createRadioStation(RadioStationCreateData $dto, User $user): RadioStation
    {
        // logo is optional and not critical, so no transaction is needed
        $logoFileName = rescue_if($dto->logo, function () use ($dto) {
            return $this->imageStorage->storeImage($dto->logo);
        });

        /** @var RadioStation $station */
        $station = $user->radioStations()->create([
            'url' => $dto->url,
            'name' => $dto->name,
            'logo' => $logoFileName,
            'description' => $dto->description,
            'is_public' => $dto->isPublic,
        ]);

        return $this->repository->findOneWithUserContext($station->id, $user);
    }

    public function updateRadioStation(RadioStation $radioStation, RadioStationUpdateData $dto): RadioStation
    {
        $data = [
            'url' => $dto->url,
            'name' => $dto->name,
            'description' => $dto->description,
            'is_public' => $dto->isPublic,
        ];

        if (is_string($dto->logo)) {
            $data['logo'] = rescue_if($dto->logo, fn () => $this->imageStorage->storeImage($dto->logo), '');
        }

        $radioStation->update($data);

        return $this->repository->findOneWithUserContext($radioStation->id, $radioStation->user);
    }
}