<?php

namespace Modular\ConnectorDependencies\Illuminate\Http\Resources;

use Modular\ConnectorDependencies\Illuminate\Pagination\AbstractCursorPaginator;
use Modular\ConnectorDependencies\Illuminate\Pagination\AbstractPaginator;
use Modular\ConnectorDependencies\Illuminate\Support\Collection;
use Modular\ConnectorDependencies\Illuminate\Support\Str;
use ReflectionClass;
trait CollectsResources
{
    /**
     * Map the given collection resource into its individual resources.
     *
     * @param  mixed  $resource
     * @return mixed
     */
    protected function collectResource($resource)
    {
        if ($resource instanceof MissingValue) {
            return $resource;
        }
        if (is_array($resource)) {
            $resource = new Collection($resource);
        }
        $collects = $this->collects();
        $this->collection = $collects && !$resource->first() instanceof $collects ? $resource->mapInto($collects) : $resource->toBase();
        return $resource instanceof AbstractPaginator || $resource instanceof AbstractCursorPaginator ? $resource->setCollection($this->collection) : $this->collection;
    }
    /**
     * Get the resource that this resource collects.
     *
     * @return string|null
     */
    protected function collects()
    {
        if ($this->collects) {
            return $this->collects;
        }
        if (Str::endsWith(\Modular\ConnectorDependencies\class_basename($this), 'Collection') && (class_exists($class = Str::replaceLast('Collection', '', get_class($this))) || class_exists($class = Str::replaceLast('Collection', 'Resource', get_class($this))))) {
            return $class;
        }
    }
    /**
     * Get the JSON serialization options that should be applied to the resource response.
     *
     * @return int
     */
    public function jsonOptions()
    {
        $collects = $this->collects();
        if (!$collects) {
            return 0;
        }
        return (new ReflectionClass($collects))->newInstanceWithoutConstructor()->jsonOptions();
    }
    /**
     * Get an iterator for the resource collection.
     *
     * @return \ArrayIterator
     */
    #[\ReturnTypeWillChange]
    public function getIterator()
    {
        return $this->collection->getIterator();
    }
}
