<?php

declare(strict_types=1);

namespace Seka\Vzdelavanie\Models\Pouzivatel\Testovanie;

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

/**
 * Class Test
 *
 * @package Seka\Vzdelavanie\Models\Pouzivatel\Testovanie
 */
class Test extends Model
{
    use Hashidable;

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

    /**
     * @var string[]
     */
    protected $fillable = [
        '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 $dates = [
        'casova_znacka_spustenia',
        'casova_znacka_vyhodnotenia',
    ];

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

    /**
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function otazky()
    {
        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->whereNotNull('casova_znacka_vyhodnotenia');
    }

    /**
     * @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 (float) 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 (float) round((100 / $vsetkych) * $this->getAttribute('pocet_nespravne_zodpovedanych_otazok') ?? 0, 1);
    }

    /**
     * @return float
     */
    public function getZodpovedaneOtazkyPercentualneAttribute(): float
    {
        return (float) 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 (float) round((100 / $this->getAttribute('pocet_vsetkych_otazok')) * $this->getAttribute('pocet_otazok_bez_odpovede') ?? 0, 1);
    }

    /**
     * @return bool
     */
    public function nebolSpusteny(): bool
    {
        return (bool) 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 ! is_null($this->getAttribute('casova_znacka_vyhodnotenia'));
    }
}
