<?php
namespace App\Validators;

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

class CompetitionsValidator
{
    public static function validate($data)
    {
        $validator = Validator::make($data, [
            'typeOfService'         => 'nullable|array',
            'typeOfService.*'       => 'required|integer|exists:departments,id',
            'typeOfAnnouncement'    => 'nullable|array',
            'typeOfAnnouncement.*'  => 'required|integer|exists:procedure_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',
            'publicationDate'       => 'sometimes|required|array',
            'publicationDate.type'  => [
                'required_with:publicationDate',
                Rule::enum(PublicationDateEnum::class)
            ],
            'publicationDate.value' => [
                'nullable',
                'date',
                'required_if:publicationDate.type,' . PublicationDateEnum::SINCE->value,
            ],
            'deadlineExpiry'        => 'sometimes|required|array',
            'deadlineExpiry.type'   => [
                'required_with:deadlineExpiry',
                Rule::enum(DeadlineExpiryEnum::class)
            ],
            'deadlineExpiry.value'  => [
                'nullable',
                'required_if:deadlineExpiry.type,' . DeadlineExpiryEnum::EARLIEST_IN->value,
                'required_if:deadlineExpiry.type,' . DeadlineExpiryEnum::EARLIEST_ON->value,
                Rule::when(function ($input) {
                    return isset($input['deadlineExpiry']) &&
                        $input['deadlineExpiry']['type'] === DeadlineExpiryEnum::EARLIEST_IN->value;
                }, ['integer'], ['date'])
            ],
            'search'                => 'nullable|string|max:100',
            'cpvs'                  => 'nullable|array',
            'cpvs.*'                => 'required|integer|exists:cpvs,id',
        ]);

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

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