<?php

namespace Pterodactyl\Traits\Services;

use BadMethodCallException;
use Illuminate\Support\Str;
use Illuminate\Contracts\Validation\Factory;
use Pterodactyl\Exceptions\Service\Egg\Variable\BadValidationRuleException;

trait ValidatesValidationRules
{
    /**
     * @return \Illuminate\Contracts\Validation\Factory
     */
    abstract protected function getValidator(): Factory;

    /**
     * Validate that the rules being provided are valid for Laravel and can
     * be resolved.
     *
     * @param array|string $rules
     *
     * @throws \Pterodactyl\Exceptions\Service\Egg\Variable\BadValidationRuleException
     */
    public function validateRules($rules)
    {
        try {
            $this->getValidator()->make(['__TEST' => 'test'], ['__TEST' => $rules])->fails();
        } catch (BadMethodCallException $exception) {
            $matches = [];
            if (preg_match('/Method \[(.+)\] does not exist\./', $exception->getMessage(), $matches)) {
                throw new BadValidationRuleException(trans('exceptions.nest.variables.bad_validation_rule', [
                    'rule' => Str::snake(str_replace('validate', '', array_get($matches, 1, 'unknownRule'))),
                ]), $exception);
            }

            throw $exception;
        }
    }
}