<?php

namespace App\Http\Requests;

use App\Support\Backoffice\Sanitizer\Traits\SanitizesInput;
use App\Validators\CompetitionsValidator;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\ValidationException;

class CompetitionListRequest extends FormRequest
{
    use SanitizesInput;

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules(): array
    {
        return [
            'page'         => 'nullable|integer',
            'itemsPerPage' => 'nullable|integer|max:100',
            'filters'      => 'nullable|array',
            'orderDir'     => "nullable|in:asc,desc",
            'orderBy'      => 'nullable|string|in:id,relevance,publicationDate',
        ];
    }

    /**
     * Filters to be applied to the input.
     *
     * @return array
     */
    public function filters(): array
    {
        $filters = [];
        if ($this->has('filters')) {
            foreach (CompetitionsValidator::getFilters() as $filter => $value) {
                $filters["filters.{$filter}"] = $value;
            }
        }

       return $filters;
    }

    public function withValidator($validator)
    {
        $validator->after(function ($validator) {
            if ($this->has('filters')) {
                try {
                    CompetitionsValidator::validate($this->filters);
                } catch (ValidationException $e) {
                    $validator->errors()->merge($e->errors());
                }
            }
        });
    }
}
