<?php

declare(strict_types=1);

namespace Seka\Portal\Modul\Statistiky\Repositories\Eloquent;

use App\Models\Pracovisko\Pracovisko;
use Prettus\Repository\Eloquent\BaseRepository;
use Seka\Portal\Modul\Statistiky\Entities\Zaznam\Zaznam;
use Seka\Portal\Modul\Statistiky\Repositories\ZaznamRepositoryContract;

/**
 * Class ZaznamRepository
 *
 * @package Seka\Portal\Modul\Statistiky\Repositories\Eloquent
 */
class ZaznamRepository extends BaseRepository implements ZaznamRepositoryContract
{
    /**
     * @var string[]
     */
    protected $fieldSearchable = [
        'subjekt_druh',
        'datum' => 'between',
    ];

    /**
     * @return string
     */
    public function model(): string
    {
        return Zaznam::class;
    }

    /**
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Zaznam $zaznam
     *
     * @throws \Prettus\Validator\Exceptions\ValidatorException
     */
    public function createFromEntity(Zaznam $zaznam): void
    {
        $this->create($zaznam->attributesToArray());
    }

    /**
     * @param \Seka\Portal\Modul\Statistiky\Entities\Zaznam\Zaznam $zaznam
     *
     * @throws \Prettus\Validator\Exceptions\ValidatorException
     */
    public function createOrUpdateFromEntity(Zaznam $zaznam): void
    {
        $result = $this->getModel()
            ->newQuery()
            ->where('subjekt_druh', $zaznam->subjekt->druh()->value)
            ->where('subjekt_nazov', $zaznam->subjekt->nazov())
            ->where('pracovisko_id', $zaznam->pracovisko_id)
            ->where('datum', $zaznam->datum)
            ->get();

        if ($result->isNotEmpty()) {
            $zaznam->update(['udaje' => $zaznam->udaje]);
        } else {
            $zaznam->save();
        }
    }
}
