<?php

declare(strict_types=1);

namespace Seka\Vzdelavanie\Models\Pouzivatel\Testovanie\Policies;

use Illuminate\Foundation\Auth\User;
use Illuminate\Auth\Access\Response;
use Illuminate\Auth\Access\HandlesAuthorization;
use Seka\Vzdelavanie\Models\Pouzivatel\Testovanie\Test;

/**
 * Class TestPolicy
 *
 * @package Seka\Vzdelavanie\Models\Pouzivatel\Testovanie\Policies
 */
final class TestPolicy
{
    use HandlesAuthorization;

    /**
     * @param $pouzivatel
     * @param $ability
     *
     * @return bool
     */
    public function before($pouzivatel, $ability): bool
    {
        if ($pouzivatel->can('vzdelavanie_testovanie') || $pouzivatel->can('vzdelavanie_testovanie.zobrazit')) {
            return true;
        }

        return false;
    }

    /**
     * @param \Illuminate\Foundation\Auth\User                    $pouzivatel
     * @param \Seka\Vzdelavanie\Models\Pouzivatel\Testovanie\Test $test
     *
     * @return \Illuminate\Auth\Access\Response
     */
    public function spustenie(User $pouzivatel, Test $test): Response
    {
        // pouzivatel musi byt majitelom vygenerovaneho testu
        return ($pouzivatel->getAuthIdentifier() === $test->pouzivatel_id) ?
            Response::allow() :
            Response::deny('Nemáte povolený prístup k spusteniu testu iného používateľa.');
    }

    /**
     * @param \Illuminate\Foundation\Auth\User                    $pouzivatel
     * @param \Seka\Vzdelavanie\Models\Pouzivatel\Testovanie\Test $test
     *
     * @return bool
     */
    public function vyhodnotit(User $pouzivatel, Test $test): bool
    {
        // pouzivatel musi byt majitelom vygenerovaneho testu
        return $pouzivatel->getAuthIdentifier() === $test->pouzivatel_id;
    }

    /**
     * @param \Illuminate\Foundation\Auth\User                    $pouzivatel
     * @param \Seka\Vzdelavanie\Models\Pouzivatel\Testovanie\Test $test
     *
     * @return bool
     */
    public function vyhodnotenie(User $pouzivatel, Test $test): bool
    {
        // pouzivatel musi byt majitelom vygenerovaneho testu
        // alebo ma rolu spravca_pek a je z rovnakeho PEK ako majitel testu
        return (
            $pouzivatel->getAuthIdentifier() === $test->pouzivatel_id
            || (
                $pouzivatel->hasRole('spravca_pek')
                && ($pouzivatel->pracovisko_id === $test->pouzivatel->pracovisko_id)
            )
        );
    }
}
