<?php

namespace App\Http\Resources\V1;

use Illuminate\Http\Resources\Json\JsonResource;
use App\Models\Artist;
use App\Models\Exhibition;
use App\Models\Collection;
use App\Http\Resources\V1\Favourites\FavouriteArtistResource;
use App\Http\Resources\V1\Favourites\FavouriteCollectionResource;
use App\Http\Resources\V1\Favourites\FavouriteExhibitionResource;
use Throwable;
use App\Models\Favourite;
use Illuminate\Support\Facades\Log;

class FavouriteResource extends JsonResource
{

    public function __construct(Favourite $resource)
    {
        parent::__construct($resource);
    }

    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id'        => $this->resource->id,
            'favourite' => $this->retrieveNormalizedModel($request)
        ];
    }

    /**
     * Gets the normalized favourite
     *
     * @param  Request $request
     * @return array
     */
    private function retrieveNormalizedModel($request): array
    {
        $item = $this->favourite;
        if (!$item && $this->resource->favouritable) {
            $item = $this->resource->favouritable;
        }

        if (empty($item)) {
            return [];
        }

        try {
            switch ($this->favourite_type) {
                case Artist::class:
                    $resource = new FavouriteArtistResource($item);
                    return $resource->toArray($request);
                case Exhibition::class:
                    $resource = new FavouriteExhibitionResource($item);
                    return $resource->toArray($request);
                case Collection::class:
                    $resource = new FavouriteCollectionResource($item);
                    return $resource->toArray($request);
            }
        } catch (Throwable $t) {
            Log::error($t);
        }

        return [];
    }
}
