<?php

namespace App\Http\Controllers\Api\V1;

use App\Http\Controllers\Controller;
use App\Http\Requests\V1\ExhibitionListRequest;
use App\Http\Resources\V1\ExhibitionResource;
use App\Services\ExhibitionDataService;
use App\Http\Resources\V1\ExhibitionCollection;
use App\Libs\Api\ParsedListParams;
use App\Services\TagDataService;
use App\Http\Requests\V1\ItemsByTagRequest;
use App\Http\Resources\V1\ExhibitionSeparatedResource;
use App\Http\Requests\V1\ExhibitionSeparatedListRequest;

class ExhibitionController extends Controller
{

    /**
     * Class constructor
     *
     * @param ExhibitionDataService $exhibitionDataService
     * @return void
     */
    public function __construct(ExhibitionDataService $exhibitionDataService)
    {
        $this->dataService = $exhibitionDataService;
    }

    /**
     * Gets the list of exhibitions
     * GET api/v1/exhibitions
     * 
     * @return App\Http\Resources\V1\ExhibitionCollection
     */
    public function index(ExhibitionListRequest $request): ExhibitionCollection
    {

        $data              = $request->validated();
        $parsedListParams  = new ParsedListParams($data);
        $paginatedItems    = $this->dataService->list($parsedListParams);
        return new ExhibitionCollection($paginatedItems);
    }


    /**
     * Gets the list of exhibitions separated in date status
     * GET api/v1/exhibitions/status
     * 
     * @return App\Http\Resources\V1\ExhibitionCollection
     */
    public function separated(ExhibitionSeparatedListRequest $request): ExhibitionSeparatedResource
    {
        $data              = $request->validated();
        $parsedListParams  = new ParsedListParams($data);

        $res    = $this->dataService->getSeparatedExhibitions($parsedListParams);
        return new ExhibitionSeparatedResource($res);
    }


    /**
     * Show entity for the given id
     * GET api/v1/exhibitions/{id}
     * 
     * @param integer $id
     * 
     * @return App\Http\Resources\V1\ExhibitionResource
     */
    public function show(int $id): ExhibitionResource
    {
        $exhibition = $this->dataService->find($id);
        return new ExhibitionResource($exhibition);
    }


    /**
     * Gets the list of exhibitions by a certain tag
     * GET api/v1/exhibitions/bytag/{$id}
     * 
     * @param int $tagId - The tag to which list the exhibitions by
     * @param TagDataService $tagDataService - The tags data service
     * 
     * @return App\Http\Resources\V1\ExhibitionCollection
     */
    public function byTag(int $tagId, TagDataService $tagDataService, ItemsByTagRequest $request): ExhibitionCollection
    {
        $data        = $request->validated();
        $params      = new ParsedListParams($data);
        $tag         = $tagDataService->find($tagId);
        $exhibitions = $this->dataService->listByTag($params, $tag);
        return new ExhibitionCollection($exhibitions);
    }
}
