<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Requests\Api\BaseShow;
use App\Http\Requests\Api\EventItemIndex;
use App\Http\Resources\EventItemResource;
use App\Models\EventItem;
use Carbon\Carbon;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Resources\Json\JsonResource;

class EventItemController extends Controller
{
    /**
     * Display the specified resource.
     *
     * @param EventItemIndex $request
     * @return JsonResource|JsonResponse
     */
    public function index(EventItemIndex $request)
    {
        $data = $request->validated();

        $query = EventItem::full()
            ->select('event_items.*', 'event_item_languages.*')
            ->where('status', 'published')
            ->where(function ($query) {
                $query->whereNull('expiration_date')
                    ->orWhere('expiration_date', '>', Carbon::now('Europe/Brussels'));
            });

        if ($data['upcoming']) {
            $query->upcoming()->orderBy('start_date', 'asc');
        } else if (!empty($data['filterTime'])) {
            switch ($data['filterTime']) {
                case 'past':
                    $query->past()->orderBy('start_date', 'desc');
                    break;
                case 'upcoming':
                    $query->upcoming()->orderBy('start_date', 'asc');
                    break;
            }
        } else {
            switch ($data['orderBy']) {
                case 'alphabetical':
                    $query->orderBy('title', 'asc');
                    break;
                default:
                    # latest
                    $query->orderByRaw('ISNULL(start_date), event_items.start_date DESC, event_items.created_at DESC');
                    break;
            }
        }

        $perPage = $data['perPage'] ?? 12;
        $page = $data['page'] ?? 1;

        $query->with([
            'topic' => function($query) {
                $query->full();
            },
            'image',
        ]);

        $eventItems = $query->paginate($perPage, ['*'], 'page', $page);

        $paginationData = [
            'currentPage' =>  intval($eventItems->currentPage()),
            'lastPage' => intval($eventItems->lastPage()),
            'perPage' =>  intval($eventItems->perPage()),
            'total' =>  intval($eventItems->total()),
            'count' =>  intval($eventItems->count()),
            'hasMorePages' => $eventItems->hasMorePages(),
            'nextPageUrl' => $eventItems->nextPageUrl(),
            'prevPageUrl' => $eventItems->previousPageUrl(),
        ];

        if ($eventItems) {
            return [
                'data' => EventItemResource::collection($eventItems),
                'pagination' => $paginationData,
            ];
        }
        return response()->json([], 404);
    }

    /**
     * Display the specified resource.
     *
     * @param BaseShow $request
     * @return JsonResource|JsonResponse
     */
    public function show(BaseShow $request)
    {
        $data = $request->validated();

        $query = EventItem::full()
            ->select('event_items.*', 'event_item_languages.*')
            ->where('status', 'published')
            ->where('lang_slug', $data['slug'])
            ->where(function ($query) {
                $query->whereNull('expiration_date')
                    ->orWhere('expiration_date', '>', Carbon::now('Europe/Brussels'));
            });

        $query->with([
            'topic' => function($query) {
                $query->full();
            },
            'image',
        ]);

        $eventItem = $query->first();

        if ($eventItem) {
            return new EventItemResource($eventItem);
        }

        return response()->json([], 404);
    }
}
