<?php

declare(strict_types=1);

namespace Seka\Portal\Modul\Statistiky\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use Seka\Portal\Modul\Statistiky\Http\View\ZaznamDatumFilterEnum;
use Spatie\Enum\Laravel\Http\EnumRequest;
use Spatie\Enum\Laravel\Http\Requests\TransformsEnums;

/**
 * Class ZaznamFilterRequest
 *
 * @package Seka\Portal\Modul\Statistiky\Http\Requests
 */
final class ZaznamFilterRequest extends FormRequest
{
    use TransformsEnums;

    /**
     * @return bool
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * @return array
     */
    public function rules(): array
    {
        return [
            'datefilter' => [
                'required',
                Rule::in(ZaznamDatumFilterEnum::toValues()),
            ],
            'date_from' => [
                Rule::requiredIf(function () {
                    return ZaznamDatumFilterEnum::from(
                        $this->request->get('datefilter')
                    )->equals(ZaznamDatumFilterEnum::POUZIVATELOM_SPECIFIKOVANY_ROZSAH());
                }),
                'date',
                'date_format:Y-m-d',
                'before_or_equal:today',
                "date_months_difference:{$this->request->get('date_from')},{$this->request->get('date_to')},12",
            ],
            'date_to' => [
                Rule::requiredIf(function () {
                    return ZaznamDatumFilterEnum::from(
                        $this->request->get('datefilter')
                    )->equals(ZaznamDatumFilterEnum::POUZIVATELOM_SPECIFIKOVANY_ROZSAH());
                }),
                'date',
                'date_format:Y-m-d',
                'after_or_equal:date_from',
                'before_or_equal:today',
                "date_months_difference:{$this->request->get('date_from')},{$this->request->get('date_to')},12",
            ],
        ];
    }

    /**
     * @return string[]
     */
    public function messages(): array
    {
        return [
            'date_from.date' => 'Hodnota nie je dátum',
            'date_from.date_format' => 'Neplatný formát dátumu',
            'date_from.before_or_equal' => 'Dátum od musí predchádzať alebo musí byť rovnaký s aktuálnym dátumom',
            'date_from.date_months_difference' => 'Rozdiel medzi zvolenými dátumami presahuje povolený rozsah',
            'date_to.date' => 'Hodnota nie je dátum',
            'date_to.date_format' => 'Neplatný formát dátumu',
            'date_to.after_or_equal' => 'Dátum do musí nasledovať po alebo musí byť rovnaký so zvoleným dátumom od',
            'date_to.before_or_equal' => 'Dátum do musí predchádzať alebo musí byť rovnaký s aktuálnym dátumom',
            'date_to.date_months_difference' => 'Rozdiel medzi zvolenými dátumami presahuje povolený rozsah',
        ];
    }

    /**
     * @return string[]
     */
    public function enums(): array
    {
        return [
            EnumRequest::REQUEST_REQUEST => [
                'datefilter' => ZaznamDatumFilterEnum::class,
            ],
        ];
    }
}
