<?php

namespace App\Http\Controllers\Api\Gallery;

use App\Http\Controllers\Controller;
use App\Http\Requests\Api\Gallery\GalleryListRequest;
use App\Http\Requests\UploadRequest;
use App\Services\GalleryService;
use App\Models\Gallery\Gallery;
use App\Http\Resources\Gallery\Gallery as GalleryResource;
use App\Http\Resources\Gallery\GalleryDetail as GalleryDetailResource;
use App\Http\Resources\Gallery\GalleryItem as GalleryItemResource;
use App\Services\AWS;
use App\Exceptions\ApiHttpException;
use App\Http\Requests\Api\Gallery\GalleryUpdateRequest;

class GalleryController extends Controller
{
    private $galleryService;

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

    public function requestUpload(UploadRequest $request, AWS $aws)
    {
        $validated = $request->validated();
        $account = auth()->user()->mainAccount;

        $gallery = Gallery::where('uid', $validated['galleryUid'])
            ->where('account_id', $account->id)
            ->first();

        if ($gallery === null) {
            throw new ApiHttpException(403, 'forbidden');
        }
        $section = $gallery->gallerySections()->first();
        // TODO: Verify rules (size limits, anonymous, etc)

        $policies = [];
        $galleryItems = [];
        $position =  $section->galleryItems->count();
        foreach($validated['fileList'] as $file) {
            $position++;
            $galleryItem = $this->galleryService->createGalleryItem($gallery, $section, $file, $position);
            $policies[] = $aws->createUploadRequest(
                $galleryItem->imageItem->key,
                $file['name'],
                $file['size'],
                $galleryItem->uid
            );
            $galleryItems[] = $galleryItem;
        }

        return response()->json([
            'policies' => $policies,
            'galleryItems' => GalleryItemResource::collection($galleryItems)
        ]);
    }

    public function store()
    {

    }

    public function getGalleries(GalleryListRequest $request)
    {
        $validatedFilter = $request->validated();
        $account = auth()->user()->mainAccount;

        $result = $this->galleryService->getGalleries($account, $validatedFilter);

        $result['results'] = GalleryResource::collection($result['results']);

        return response()->json($result);
    }

    public function getGallery($accountUid, $galleryUid)
    {
        $account = auth()->user()->mainAccount;
        $gallery = $account->galleries()
            ->where('uid', $galleryUid)
            ->with(['gallerySections' => function($query) {
                $query->with(['galleryItems' => function($query) {
                    // $query->orderBy('position', 'asc');
                }]);
            }])
            ->first();
        if ($gallery === null) {
            throw new ApiHttpException(403, 'forbidden');
        }

        return response()->json(new GalleryDetailResource($gallery));
    }

    public function createGallery()
    {
        $account = auth()->user()->mainAccount;
        $gallery = $this->galleryService->createGallery($account);
        $gallery->gallerySections->first()->load('galleryItems');
        return response()->json(new GalleryDetailResource($gallery));
    }

    public function updateGallery(GalleryUpdateRequest $request, $accountUid, $galleryUid)
    {
        $account = auth()->user()->mainAccount;
        $validatedData = $request->validated();

        $gallery = Gallery::where('uid', $galleryUid)
            ->where('account_id', $account->id)
            ->first();

        if ($gallery === null) {
            throw new ApiHttpException(403, 'forbidden');
        }

        $this->galleryService->updateGallery($gallery, $validatedData);

        return response()->json(new GalleryResource($gallery));
    }

    public function deleteGallery(GalleryUpdateRequest $request, $accountUid, $galleryUid)
    {
        $account = auth()->user()->mainAccount;
        $validatedData = $request->validated();

        if ($account->uid !== $accountUid) {
            throw new ApiHttpException(403, 'forbidden');
        }

        $gallery = Gallery::where('uid', $galleryUid)
            ->where('account_id', $account->id)
            ->first();

        if ($gallery === null) {
            throw new ApiHttpException(403, 'forbidden');
        }

        $this->galleryService->deleteGallery($gallery);

        return response()->json(new GalleryResource($gallery));
    }
}
