<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Models\Calendar;
use App\Models\ContentElement;
use App\Models\Version;

use App\Utilities\Paginate;
use Illuminate\Support\Arr;

class CalendarsController extends Controller
{
    public function events()
    {
        request()->validate([
            'uuid' => 'required|exists:content_elements',
            'contentable_id' => 'required|integer',
            'contentable_type' => 'required|string',
            'start_date' => 'date|nullable',
            'end_date' => 'date|nullable',
        ]);

        // go find the page that this content element is on
        $contentable = ContentElement::findContentable([
            'pivot' => [
                'contentable_id' => request('contentable_id'),
                'contentable_type' => request('contentable_type'),
            ],
        ]);

        $content_elements_ids = ContentElement::whereHasMorph('content', [Calendar::class])
            ->where('uuid', request('uuid'))
            ->get()
            ->pluck('id');

        $content_elements = $contentable->contentElements()->whereIn('content_element_id', $content_elements_ids)->get();

        $content_elements = $content_elements->filter(function ($ce) use ($contentable) {
            $is_published = (bool) Version::find($ce->pivot->version_id)->published_at;

            if (!auth()->check()) {
                if (session()->get('preview_version_id') === $contentable->getDraftVersion()->id) {
                    return true;
                }
                return $is_published;
            }

            if (auth()->user()->can('update', $contentable) && editing()) {
                return true;
            } else {
                return $is_published;
            }
        })
        ->sortByDesc(function ($ce) {
            return $ce->pivot->version_id;
        });

        $content_element = $content_elements->first();

        if (!$content_element) {
            return Paginate::create(collect());
        }

        if ($content_element->permissions->count()) {
            if (!auth()->check()) {
                abort(401);
            }

            if (!auth()->user()->can('view', $content_element)) {
                abort(403);
            }
        }

        $events = $content_element->content->getCalendarEvents(null, request()->only(['start_date', 'end_date']));

        if (request('pages')) {
            $events = $events->filter(function ($event) {
                return $event->page ? true : false;
            });
        }

        if (request('paginate')) {
            return Paginate::create($events);
        } else {
            return response()->json(['events' => $events]);
        }
    }
}
