<?php

namespace IAWPSCOPED\Illuminate\Database\Eloquent\Relations\Concerns;

use IAWPSCOPED\Illuminate\Database\Eloquent\Model;
/** @internal */
trait SupportsDefaultModels
{
    /**
     * Indicates if a default model instance should be used.
     *
     * Alternatively, may be a Closure or array.
     *
     * @var \Closure|array|bool
     */
    protected $withDefault;
    /**
     * Make a new related instance for the given model.
     *
     * @param  \Illuminate\Database\Eloquent\Model  $parent
     * @return \Illuminate\Database\Eloquent\Model
     */
    protected abstract function newRelatedInstanceFor(Model $parent);
    /**
     * Return a new model instance in case the relationship does not exist.
     *
     * @param  \Closure|array|bool  $callback
     * @return $this
     */
    public function withDefault($callback = \true)
    {
        $this->withDefault = $callback;
        return $this;
    }
    /**
     * Get the default value for this relation.
     *
     * @param  \Illuminate\Database\Eloquent\Model  $parent
     * @return \Illuminate\Database\Eloquent\Model|null
     */
    protected function getDefaultFor(Model $parent)
    {
        if (!$this->withDefault) {
            return;
        }
        $instance = $this->newRelatedInstanceFor($parent);
        if (\is_callable($this->withDefault)) {
            return \call_user_func($this->withDefault, $instance, $parent) ?: $instance;
        }
        if (\is_array($this->withDefault)) {
            $instance->forceFill($this->withDefault);
        }
        return $instance;
    }
}
