<?php

namespace App\Http\Livewire\Components\Informacia\Components;

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
 *
 * @package App\Http\Livewire\Components\Informacia\Components
 */
final class HodnotiaceTlacidla extends Component
{
    use AuthorizesRequests;

    /**
     * @var bool
     */
    public bool $povolitZaporneHodnotenie;
    /**
     * @var Model
     */
    public $hodnotenyZaznam;
    /**
     * @var int
     */
    public int $pocetKladnychHodnoteni = 0;
    /**
     * @var int
     */
    public int $pocetZapornychHodnoteni = 0;
    /**
     * @var bool
     */
    public bool $hodnoteniePouzivatelaKladne = false;
    /**
     * @var bool
     */
    public bool $hodnoteniePouzivatelaZaporne = false;

    /**
     * @var HodnotenieRepositoryContract
     */
    protected HodnotenieRepositoryContract $hodnotenieRepository;

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

    /**
     * @param HodnotenieRepositoryContract $hodnotenieRepository
     * @return void
     */
    public function boot(HodnotenieRepositoryContract $hodnotenieRepository): void
    {
        $this->hodnotenieRepository = $hodnotenieRepository;
    }

    /**
     * @param bool|null $povolitZaporneHodnotenie
     * @param Model $hodnotenyZaznam
     * @return void
     */
    public function mount(
        ?bool $povolitZaporneHodnotenie,
        Model $hodnotenyZaznam
    ): void {
        $this->povolitZaporneHodnotenie = $povolitZaporneHodnotenie ?? false;
        $this->hodnotenyZaznam = $hodnotenyZaznam;

        $this->nacitajAktualneHodnotenia();
    }

    /**
     * @return void
     */
    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 && HodnotenieEnum::kladne()->equals(
                $hodnoteniePouzivatela,
            );
        $this->hodnoteniePouzivatelaZaporne = $hodnoteniePouzivatela && HodnotenieEnum::zaporne()->equals(
                $hodnoteniePouzivatela,
            );

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

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

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

            return;
        }
    }
}
