<?php

namespace Modular\ConnectorDependencies\Illuminate\Http\Resources\Json;

use Modular\ConnectorDependencies\Illuminate\Support\Arr;
class PaginatedResourceResponse extends ResourceResponse
{
    /**
     * Create an HTTP response that represents the object.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function toResponse($request)
    {
        return \Modular\ConnectorDependencies\tap(\Modular\ConnectorDependencies\response()->json($this->wrap($this->resource->resolve($request), array_merge_recursive($this->paginationInformation($request), $this->resource->with($request), $this->resource->additional)), $this->calculateStatus(), [], $this->resource->jsonOptions()), function ($response) use ($request) {
            $response->original = $this->resource->resource->map(function ($item) {
                return is_array($item) ? Arr::get($item, 'resource') : $item->resource;
            });
            $this->resource->withResponse($request, $response);
        });
    }
    /**
     * Add the pagination information to the response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    protected function paginationInformation($request)
    {
        $paginated = $this->resource->resource->toArray();
        $default = ['links' => $this->paginationLinks($paginated), 'meta' => $this->meta($paginated)];
        if (method_exists($this->resource, 'paginationInformation')) {
            return $this->resource->paginationInformation($request, $paginated, $default);
        }
        return $default;
    }
    /**
     * Get the pagination links for the response.
     *
     * @param  array  $paginated
     * @return array
     */
    protected function paginationLinks($paginated)
    {
        return ['first' => $paginated['first_page_url'] ?? null, 'last' => $paginated['last_page_url'] ?? null, 'prev' => $paginated['prev_page_url'] ?? null, 'next' => $paginated['next_page_url'] ?? null];
    }
    /**
     * Gather the meta data for the response.
     *
     * @param  array  $paginated
     * @return array
     */
    protected function meta($paginated)
    {
        return Arr::except($paginated, ['data', 'first_page_url', 'last_page_url', 'prev_page_url', 'next_page_url']);
    }
}
