/home/bdqbpbxa/api-uniferx.goodface.com.ua/vendor/laravel/nova/src/Fields/Dependent.php
<?php

namespace Laravel\Nova\Fields;

use Illuminate\Support\Arr;
use Laravel\Nova\Http\Requests\NovaRequest;

/**
 * @phpstan-type TDependentResolver (callable(static, \Laravel\Nova\Http\Requests\NovaRequest, \Laravel\Nova\Fields\FormData):(void))|class-string
 */
class Dependent
{
    /**
     * The dependent context.
     *
     * @var array<int, string>
     */
    public $context = ['create', 'update'];

    /**
     * The dependent attributes.
     *
     * @var array<int, string|\Laravel\Nova\Fields\Field>
     */
    public $attributes = [];

    /**
     * The dependent resolver.
     *
     * @var callable
     *
     * @phpstan-var TDependentResolver
     */
    public $resolver;

    /**
     * The dependent resolved FormData.
     *
     * @var \Laravel\Nova\Fields\FormData|null
     */
    public $formData;

    /**
     * Create a new dependent object.
     *
     * @param  string|\Laravel\Nova\Fields\Field|array<int, string|\Laravel\Nova\Fields\Field>  $attributes
     * @param  callable  $resolver
     * @param  string|array<int, string>|null  $context
     *
     * @phpstan-param TDependentResolver $resolver
     */
    public function __construct($attributes, $resolver, $context = null)
    {
        $this->context = Arr::wrap($context ?? $this->context);

        $this->resolver = $resolver;

        $this->attributes = collect(Arr::wrap($attributes))->map(function ($item) {
            /** @var string|\Laravel\Nova\Fields\Field $item */
            if ($item instanceof MorphTo) {
                return [$item->attribute, "{$item->attribute}_type"];
            }

            return $item instanceof Field ? $item->attribute : $item;
        })->flatten()->all();
    }

    /**
     * Handle the dependencies for request.
     *
     * @param  \Laravel\Nova\Fields\Field  $field
     * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
     * @return $this
     */
    public function handle(Field $field, NovaRequest $request)
    {
        /** @var TDependentResolver|null $resolver */
        $resolver = (
            ($request->isCreateOrAttachRequest() && ! in_array('create', $this->context))
            || ($request->isUpdateOrUpdateAttachedRequest() && ! in_array('update', $this->context))
        ) ? null : $this->resolver;

        $this->formData = FormData::onlyFrom($request, array_merge($this->attributes, [$field->attribute]));

        if (is_string($resolver) && class_exists($resolver)) {
            $resolver = new $resolver();
        }

        if (is_callable($resolver)) {
            call_user_func($resolver, $field, $request, $this->formData);
        }

        return $this;
    }

    /**
     * Get depedent attributes.
     *
     * @return array<string, mixed>
     */
    public function getAttributes()
    {
        return collect($this->attributes)->mapWithKeys(function ($attribute) {
            return [$attribute => optional($this->formData)->get($attribute)];
        })->all();
    }
}