<?php

namespace App\Http\Controllers\Frontend;

use App\Facades\WatchlistsService;
use App\Http\Controllers\Controller;
use App\Http\Requests\WatchlistAddRemoveCompetitionsRequest;
use App\Http\Requests\WatchlistAddRemoveItemsRequest;
use App\Http\Requests\WatchlistCompetitionsRequest;
use App\Http\Requests\WatchlistItemsRequest;
use App\Http\Requests\WatchlistRequest;
use App\Http\Resources\Watchlists\WatchlistResource;
use App\Http\Resources\Watchlists\WatchlistResourceCollection;
use Illuminate\Support\Facades\Auth;

class WatchlistsController extends Controller
{
    public function postCreate(WatchlistRequest $request)
    {
        $data = $request->validated();

        $user = Auth::user();

        $watchlist = WatchlistsService::createWatchlist($user, $data, false, $data['type'] ?? null);

        return new WatchlistResource($watchlist);
    }

    public function updateWatchlist(WatchlistRequest $request, $watchlistId)
    {
        $data = $request->validated();

        $user = Auth::user();

        $watchlist = WatchlistsService::updateWatchlist($user, $watchlistId, $data);

        return new WatchlistResource($watchlist);
    }

    public function deleteWatchlist($watchlistId)
    {
        $user = Auth::user();

        WatchlistsService::deleteWatchlist($user, $watchlistId);

        return response()->json(['success' => true], 200);
    }

    public function addCompetitionsToWatchlist(WatchlistAddRemoveCompetitionsRequest $request, int $watchlistId)
    {
        $user = Auth::user();

        $data = $request->validated();

        WatchlistsService::addCompetitionsToWatchlist($user, $watchlistId, $data['competitionIds']);

        return response()->json(['success' => true], 200);
    }

    public function removeCompetitionsFromWatchlist(WatchlistAddRemoveCompetitionsRequest $request, int $watchlistId)
    {
        $user = Auth::user();

        $data = $request->validated();

        WatchlistsService::removeCompetitionsFromWatchlist($user, $watchlistId, $data['competitionIds']);

        return response()->json(['success' => true], 200);
    }

    public function getWatchlist(int $watchlistId)
    {
        $user = Auth::user();
        $type = request()->query('type');

        $watchlist = WatchlistsService::getWatchlist($user, $watchlistId, $type);

        return new WatchlistResource($watchlist);
    }

    public function getWatchlists()
    {
        $user = Auth::user();
        $type = request()->query('type');

        $watchlists = WatchlistsService::getWatchlists($user, $type);

        return WatchlistResource::collection($watchlists);
    }

    public function getWatchlistCompetitions(WatchlistCompetitionsRequest $request, int $watchlistId)
    {
        $user = Auth::user();

        $data = $request->validated();

        $competitions = WatchlistsService::getWatchlistCompetitions($user, $watchlistId, $data);

        return new WatchlistResourceCollection($competitions, WatchlistsService::getWatchlistCompetitionsCount($user, $watchlistId));
    }

    public function getWatchlistItems(WatchlistItemsRequest $request, int $watchlistId)
    {
        $user = Auth::user();

        $data = $request->validated();

        $items = WatchlistsService::getWatchlistItems($user, $watchlistId, $data);

        return new WatchlistResourceCollection($items, WatchlistsService::getWatchlistItemsCount($user, $watchlistId));
    }

    public function addItemsToWatchlist(WatchlistAddRemoveItemsRequest $request, int $watchlistId)
    {
        $user = Auth::user();

        $data = $request->validated();

        WatchlistsService::addItemsToWatchlist($user, $watchlistId, $data['itemIds']);

        return response()->json(['success' => true], 200);
    }

    public function removeItemsFromWatchlist(WatchlistAddRemoveItemsRequest $request, int $watchlistId)
    {
        $user = Auth::user();

        $data = $request->validated();

        WatchlistsService::removeItemsFromWatchlist($user, $watchlistId, $data['itemIds']);

        return response()->json(['success' => true], 200);
    }
}
