<?php

namespace App\Livewire\Components\Informacie;

use App\Models\Hodnotenie\HodnotenieEnum;
use App\Repositories\HodnotenieRepositoryContract;
use Exception;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\View\Factory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\View\View;
use Livewire\Component;

/**
 * Class HodnotiaceTlacidla
 */
final class HodnotiaceTlacidla extends Component
{
    use AuthorizesRequests;

    public bool $povolitZaporneHodnotenie;

    /**
     * @var Model
     */
    public $hodnotenyZaznam;

    public int $pocetKladnychHodnoteni = 0;

    public int $pocetZapornychHodnoteni = 0;

    public bool $hodnoteniePouzivatelaKladne = false;

    public bool $hodnoteniePouzivatelaZaporne = false;

    protected HodnotenieRepositoryContract $hodnotenieRepository;

    /**
     * @var string[]
     */
    protected $listeners = [
        'hodnotenieBoloZmenene' => 'nacitajAktualneHodnotenia',
    ];

    public function boot(HodnotenieRepositoryContract $hodnotenieRepository): void
    {
        $this->hodnotenieRepository = $hodnotenieRepository;
    }

    public function mount(
        ?bool $povolitZaporneHodnotenie,
        Model $hodnotenyZaznam,
    ): void {
        $this->povolitZaporneHodnotenie = $povolitZaporneHodnotenie ?? false;
        $this->hodnotenyZaznam = $hodnotenyZaznam;

        $this->nacitajAktualneHodnotenia();
    }

    public function nacitajAktualneHodnotenia(): void
    {
        $this->pocetKladnychHodnoteni = $this->hodnotenieRepository->pocetHodnoteniPodlaDruhu(
            $this->hodnotenyZaznam,
            HodnotenieEnum::kladne,
        );
        $this->pocetZapornychHodnoteni = $this->hodnotenieRepository->pocetHodnoteniPodlaDruhu(
            $this->hodnotenyZaznam,
            HodnotenieEnum::zaporne,
        );
        $hodnoteniePouzivatela = $this->hodnotenieRepository->hodnoteniePouzivatela(
            auth()->user(),
            $this->hodnotenyZaznam,
        );
        $this->hodnoteniePouzivatelaKladne = $hodnoteniePouzivatela && ($hodnoteniePouzivatela === HodnotenieEnum::kladne);
        $this->hodnoteniePouzivatelaZaporne = $hodnoteniePouzivatela && ($hodnoteniePouzivatela === HodnotenieEnum::zaporne);

        $this->dispatch('aktualizovanyPocetHodnoteni', $this->hodnotenyZaznam->pocetHodnoteni());
    }

    public function render(): Factory|View|Application
    {
        return view('livewire.components.hodnotenie.hodnotiace-tlacidla');
    }

    /**
     * @throws Exception
     */
    public function zmenitHodnotenie(string $hodnotenieValue): void
    {
        try {
            $this->hodnotenieRepository->ohodnot(
                auth()->user(),
                $this->hodnotenyZaznam,
                HodnotenieEnum::from($hodnotenieValue),
            );
        } finally {
            $this->dispatch('hodnotenieBoloZmenene')->self();

            return;
        }
    }
}
