<?php

declare(strict_types=1);

namespace Seka\Vzdelavanie\Models\Testovanie;

use Core\Http\Traits\Hashidable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
use Seka\Vzdelavanie\Enums\ModelStatusEnum;

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

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

    /**
     * @var string[]
     */
    protected $fillable = [
        'stav',
        'znenie',
        'druh_spravnej_odpovede',
    ];

    /**
     * @var string[]
     */
    protected $casts = [
        'stav' => ModelStatusEnum::class,
        'druh_spravnej_odpovede' => DruhSpravnejOdpovedeEnum::class,
    ];

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

    /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function test()
    {
        return $this->belongsTo(Test::class, 'testovanie_testy_id', 'id');
    }

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

    /**
     * @return bool
     */
    public function spravneZodpovedana(): bool
    {
        $spravnychOdpovedi = $this->getAttribute('pocet_spravnych_odpovedi');

        switch ($this->getAttribute('druh_spravnej_odpovede')) {
            case DruhSpravnejOdpovedeEnum::ZIADNA():
                return $spravnychOdpovedi === 0;
            case DruhSpravnejOdpovedeEnum::JEDNA():
            case DruhSpravnejOdpovedeEnum::MINIMALNE_JEDNA():
                return $spravnychOdpovedi >= 1;
            case DruhSpravnejOdpovedeEnum::DVE():
                return $spravnychOdpovedi === 2;
            case DruhSpravnejOdpovedeEnum::TRI():
                return $spravnychOdpovedi === 3;
            default:
                return false;
        }
    }
}
