<?php

namespace App\Http\Requests\V1;

use Illuminate\Foundation\Http\FormRequest;
use App\Libs\Api\ParsedListParams;
use App\Libs\Support\Sanitizer\Traits\SanitizesInput;

class ExhibitionListRequest extends FormRequest
{
    use SanitizesInput;


    /**
     * Get data to be validated from the request.
     *
     * @return array
     */
    public function validationData(): array
    {
        $defaultValidationData   = ParsedListParams::getDefaultApiListRequestValidationData($this);
        //optional aditional validation data
        $adicionalValidationData = [];

        return array_replace($defaultValidationData, $adicionalValidationData);
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules(): array
    {
        $defaultRules   = ParsedListParams::getDefaultApiListRequestRules();
        $adicionalRules = [
            'filter.city_id'        => 'nullable|array',
            'filter.city_id.*'      => 'required|integer',
            'filter.city_name'      => 'nullable|string',
            'filter.date_from'      => 'nullable|date|date_format:d-m-Y',
            'filter.date_to'        => 'nullable|date|date_format:d-m-Y|after_or_equal:filter.date_from',
            'filter.location_id'    => 'array',
            'filter.location_id.*'  => 'integer',
            'filter.artist_id'      => 'nullable|array',
            'filter.artist_id.*'    => 'required|integer',
            'filter.artist_name'    => 'nullable|string',
            'filter.highlights'     => 'sometimes|boolean',
            'order.by'              => 'nullable|in:name,date_from,date_to',
            'filter.latitude'       => 'numeric|between:-90,90|required_with:filter.longitude,filter.radius',
            'filter.longitude'      => 'numeric|between:-180,180|required_with:filter.latitude,,filter.radius',
            'filter.radius'         => 'numeric|nullable|gt:0',
            'filter.country_code'   => 'sometimes|string'
        ];
        return array_replace($defaultRules, $adicionalRules);
    }

    /**
     * Filters to be applied to the input.
     *
     * @return array
     */
    public function filters()
    {

        $defaultFilters  = ParsedListParams::getDefaultApiListFilters();
        //optional aditional filters to apply
        $adicionalFilters = [
            'filter.artist_id'   => 'parse_csv_values',
            'filter.city_id'     => 'parse_csv_values',
            'filter.location_id' => 'parse_csv_values',
            'filter.date_from'   => 'empty_string_to_null',
            'filter.date_to'     => 'empty_string_to_null',
            'order.by'           => 'empty_string_to_null',
            'filter.highlights'  => 'cast_to_boolean',
            'filter.latitude'    => 'cast:float',
            'filter.longitude'   => 'cast:float',
            'filter.radius'      => 'cast:integer',
        ];
        return array_replace($defaultFilters, $adicionalFilters);
    }
}
