<?php
namespace App\Validators;

use App\Enums\ResultDateEnum;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
use Illuminate\Validation\ValidationException;

class ResultsValidator
{
    public static function validate($data)
    {
        $validator = Validator::make($data, [
            'typeOfAnnouncement'    => 'nullable|array',
            'typeOfAnnouncement.*'  => 'required|integer|exists:procedure_types,id',
            'typeOfBuilding'        => 'nullable|array',
            'typeOfBuilding.*'      => 'required|integer|exists:building_types,id',
            'countries'             => 'nullable|array',
            'countries.*'           => 'required|integer|exists:countries,id',
            'locations'             => 'nullable|array',
            'locations.*'           => 'required|array',
            'locations.*.stateId'   => 'nullable|integer|exists:states,id',
            'locations.*.id'        => 'nullable|integer|exists:cities,id|required_without:locations.*.stateId',
            'locations.*.radius'    => 'nullable|integer|required_with:locations.*.id',
            'resultDate'            => 'sometimes|required|array',
            'resultDate.type'       => [
                'required_with:resultDate',
                Rule::enum(ResultDateEnum::class)
            ],
            'resultDate.value'      => [
                'nullable',
                'required_if:resultDate.type,' . ResultDateEnum::SINCE->value,
                'date',
            ],
            'search'                => 'nullable|string|max:100',
            'isMagazineOnly'        => 'nullable|boolean',
            'hasTrackedResult'      => 'nullable|boolean'
        ]);

        if ($validator->fails()) {
            throw new ValidationException($validator);
        }
    }

    public static function getFilters(): Array
    {
        return [
            'search' => 'trim|strip_tags|xss_clean',
        ];
    }
}
