<?php

declare(strict_types=1);

namespace Seka\Portal\Modul\Vzdelavanie\Models\Pouzivatel\Testovanie;

use Elceka\Laravel\HashId\Http\Traits\Hashidable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;

/**
 * Class Test
 *
 * @property $id
 * @property $stav
 * @property $nazov
 * @property $popis
 * @property $casova_znacka_spustenia
 * @property $pocet_otazok_bez_odpovede
 * @property $casova_znacka_vyhodnotenia
 * @property $max_pocet_spravnych_odpovedi
 * @property $pocet_spravne_zodpovedanych_otazok
 * @property $pocet_nespravne_zodpovedanych_otazok
 * @property $pocet_vsetkych_otazok
 * @property $pocet_zodpovedanych_otazok
 * @property $spravne_zodpovedane_otazky_percentualne
 * @property $nespravne_zodpovedane_otazky_percentualne
 * @property $zodpovedane_otazky_percentualne
 * @property $nezodpovedane_otazky_percentualne
 *
 * @package Seka\Portal\Modul\Vzdelavanie\Models\Pouzivatel\Testovanie
 */
class Test extends Model
{
    use Hashidable;

    /**
     * @var string
     */
    protected $table = 'vzdelavanie_pouzivatel_testovanie_testy';

    /**
     * @var string[]
     */
    protected $withCount = ['otazky as otazky_count'];

    /**
     * @var string[]
     */
    protected $fillable = [
        'stav',
        'nazov',
        'popis',
        'casova_znacka_spustenia',
        'pocet_otazok_bez_odpovede',
        'casova_znacka_vyhodnotenia',
        'max_pocet_spravnych_odpovedi',
        'pocet_spravne_zodpovedanych_otazok',
        'pocet_nespravne_zodpovedanych_otazok',
    ];

    /**
     * @var string[]
     */
    protected $appends = [
        'pocet_vsetkych_otazok',
        'pocet_zodpovedanych_otazok',
        'spravne_zodpovedane_otazky_percentualne',
        'nespravne_zodpovedane_otazky_percentualne',
        'zodpovedane_otazky_percentualne',
        'nezodpovedane_otazky_percentualne',
    ];

    /**
     * @var string[]
     */
    protected $casts = [
        'stav' => StavVyhodnoteniaTestuEnum::class,
        'casova_znacka_spustenia' => 'immutable_datetime',
        'casova_znacka_vyhodnotenia' => 'immutable_datetime',
    ];

    /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function pouzivatel(): BelongsTo
    {
        return $this->belongsTo('\App\Models\Pouzivatel\Pouzivatel', 'pouzivatel_id', 'id');
    }

    /**
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function otazky(): HasMany
    {
        return $this->hasMany(Otazka::class, 'pouzivatel_testovanie_test_id', 'id');
    }

    /**
     * @param \Illuminate\Database\Eloquent\Builder $query
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeVyhodnoteny(Builder $query): Builder
    {
        return $query->where('stav', StavVyhodnoteniaTestuEnum::VYHODNOTENY);
    }

    /**
     * @return int
     */
    public function getPocetVsetkychOtazokAttribute(): int
    {
        return (int)$this->otazky_count ?? 0;
    }

    /**
     * @return int
     */
    public function getPocetZodpovedanychOtazokAttribute(): int
    {
        return (int)$this->getAttribute('pocet_vsetkych_otazok') - $this->getAttribute(
            'pocet_otazok_bez_odpovede',
        ) ?? 0;
    }

    /**
     * @return float
     */
    public function getSpravneZodpovedaneOtazkyPercentualneAttribute(): float
    {
        $vsetkych = $this->getAttribute('pocet_vsetkych_otazok') - $this->getAttribute('pocet_otazok_bez_odpovede');
        $vsetkych = ($vsetkych > 0) ? $vsetkych : 100;

        return round((100 / $vsetkych) * $this->getAttribute('pocet_spravne_zodpovedanych_otazok') ?? 0, 1);
    }

    /**
     * @return float
     */
    public function getNespravneZodpovedaneOtazkyPercentualneAttribute(): float
    {
        $vsetkych = $this->getAttribute('pocet_vsetkych_otazok') - $this->getAttribute('pocet_otazok_bez_odpovede');
        $vsetkych = ($vsetkych > 0) ? $vsetkych : 100;

        return round((100 / $vsetkych) * $this->getAttribute('pocet_nespravne_zodpovedanych_otazok') ?? 0, 1);
    }

    /**
     * @return float
     */
    public function getZodpovedaneOtazkyPercentualneAttribute(): float
    {
        return round(
            (100 / $this->getAttribute('pocet_vsetkych_otazok')) * ($this->getAttribute(
                    'pocet_vsetkych_otazok',
                ) - $this->getAttribute('pocet_otazok_bez_odpovede')),
            1,
        );
    }

    /**
     * @return float
     */
    public function getNezodpovedaneOtazkyPercentualneAttribute(): float
    {
        return round(
            (100 / $this->getAttribute('pocet_vsetkych_otazok')) * $this->getAttribute(
                'pocet_otazok_bez_odpovede',
            ) ?? 0,
            1,
        );
    }

    /**
     * @return bool
     */
    public function nebolSpusteny(): bool
    {
        return is_null($this->getAttribute('casova_znacka_spustenia'));
    }

    /**
     * @return bool
     */
    public function bolSpusteny(): bool
    {
        return !is_null($this->getAttribute('casova_znacka_spustenia'));
    }

    /**
     * @return bool
     */
    public function jeVyhodnoteny(): bool
    {
        return $this->getAttribute('stav') === StavVyhodnoteniaTestuEnum::VYHODNOTENY;
    }
}
