<?php

namespace App\Http\Controllers\Api\V1;

use App\Http\Requests\V1\ArtistListRequest;
use App\Http\Resources\V1\ArtistResource;
use App\Services\ArtistDataService;
use App\Http\Controllers\Api\V1\ApiController;
use App\Http\Resources\V1\ArtistCollection;
use App\Libs\Api\ParsedListParams;
use App\Http\Requests\V1\ItemsByTagRequest;
use App\Services\TagDataService;

class ArtistController extends ApiController
{

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

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

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

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


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