<?php

namespace App\Http\Controllers\Api\V1;

use App\Http\Requests\V1\FavouriteStoreRequest;
use App\Services\FavouriteDataService;
use Symfony\Component\HttpFoundation\JsonResponse;
use App\Http\Resources\V1\FavouriteResource;
use App\Http\Resources\V1\FavouriteCollection;
use App\Http\Requests\V1\FavouriteListRequest;
use App\Libs\Api\ParsedListParams;
use Illuminate\Support\Facades\Auth;

class FavouriteController extends ApiController
{

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

    /**
     * Gets the list of the users favourites
     * GET api/v1/favourites
     * 
     * @return App\Http\Resources\V1\FavouriteCollection
     */
    public function index(FavouriteListRequest $request): FavouriteCollection
    {

        $data              = $request->validated();
        $user              = Auth::user();
        $parsedListParams  = new ParsedListParams($data);
        $paginatedItems    = $this->dataService->list($parsedListParams, $user);
        return new FavouriteCollection($paginatedItems);
    }



    /**
     * Store a newly created resource in storage.
     *
     * @param App\Http\Requests\V1\FavouriteStoreRequest  $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function store(FavouriteStoreRequest $request): JsonResponse
    {

        $user  = Auth::user();
        $data  = $request->validated();

        $favourite = $this->dataService->store($user, $data);
        $favourite->load($this->dataService->getWithStructure());


        $data = new FavouriteResource($favourite);
        return response()->json($data->toArray($request), 200);
    }


    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\JsonResponse
     */
    public function destroy($id): JsonResponse
    {
        $removed = $this->dataService->delete($id);

        if ($removed) {
            return response()->json(['message' => trans('api.sucess_delete')], 200);
        }
        return response()->json([
            'code' => 'delete_error',
            'message' => trans('api.delete_error')
        ], 200);
    }
}
