<?php

namespace App\Http\Controllers\Api\Gallery;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Requests\Api\Gallery\GalleryItemUpdateRequest;
use App\Services\GalleryService;
use App\Http\Resources\Gallery\GalleryItem as GalleryItemResource;
use App\Exceptions\ApiHttpException;
use App\Models\Gallery\GalleryItem;

class GalleryItemController extends Controller
{
    private $galleryService;

    /**
     * Create a new GalleryController instance.
     *
     * @return void
     */
    public function __construct(GalleryService $galleryService)
    {
        $this->galleryService = $galleryService;
    }

    public function update(GalleryItemUpdateRequest $request)
    {
        $validatedData = $request->validated();
        $galleryItem = $this->getGalleryItem($request);
        $this->galleryService->updateGalleryItem($galleryItem, $validatedData);

        return response()->json(new GalleryItemResource($galleryItem));
    }

    public function delete(GalleryItemUpdateRequest $request)
    {
        $validatedData = $request->validated();
        $galleryItem = $this->getGalleryItem($request);
        $this->galleryService->deleteGalleryItem($galleryItem);

        return response()->json([]);
    }

    /**
     * Service method for lambda function use
     */
    public function setImageMeta(Request $request)
    {
        $uid = $request->input('itemUid');
        $metadata = $request->input('metadata');

        if (empty($uid)) {
            throw new ApiHttpException(400, 'bad_request');
        }

        $galleryItem = GalleryItem::where('uid', $uid)->first();

        if (!$galleryItem) {
            throw new ApiHttpException(404, 'Item not found');
        }

        $this->galleryService->setItemMeta($galleryItem, $metadata);

        return response()->json([]);
    }

    protected function getGalleryItem(Request $request)
    {
        $account = auth()->user()->mainAccount;
        $gallery = $account->galleries()->where('uid', $request->route('galleryUid'))->first();
        if ($gallery === null) {
            throw new ApiHttpException(403, 'forbidden');
        }
        $galleryItem = $gallery->galleryItems()->where('uid', $request->route('galleryItemUid'))->first();
        if ($galleryItem === null) {
            throw new ApiHttpException(403, 'forbidden');
        }
        return $galleryItem;
    }
}
