<?php

namespace App\Http\Requests\V1;

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

class CollectionListRequest 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.artist_id'      => 'nullable|array',
            'filter.artist_id.*'    => 'required|integer',
            'filter.artist_name'    => 'nullable|string',
            'order.by'              => 'nullable|in:name',
            'filter.highlights'     => 'sometimes|boolean',
            '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',
        ];
        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',
            'order.by'           => 'empty_string_to_null',
            'filter.highlights'  => 'cast_to_boolean'
        ];
        return array_replace($defaultFilters, $adicionalFilters);
    }
}
