<?php

namespace App\Utilities;

use App\Models\Page;
use App\Models\Livestream;
use App\Models\Blog;
use App\Models\Announcement;
use App\Models\Inquiry;
use App\Models\Course;
use App\Models\StaffProfile;
use App\Models\TimetableContent;
use App\Models\Version;

class Menu
{
    public static function getMenu()
    {
        if (auth()->check()) {
            $cache_key = 'user-'.auth()->user()->id.'-menu';
        } else {
            $cache_key = 'guest-menu';
        }

        if (editing()) {
            $cache_key .= '-editing';
        }

        if (request('preview')) {
            $cache_key .= '-preview';
        }

        return cache()->tags(['nav-menu'])->rememberForever($cache_key, function () {
            return Page::find(1)->sub_menu->each->append(['sub_menu', 'photo', 'teaser', 'name'])->toArray();
        });

        /*
        return Page::with('activeVersion')
            ->whereHas('activeVersion', function($query) {
                $query->where('parent_page_id', 1)
                    ->where('unlisted', false);
            })
            ->get()
            ->append(['full_slug', 'sub_menu']);
         */

        /*
        return Version::where('versionable_type', 'App\\Models\\Page')
            ->where('parent_page_id', 1)
            ->where('unlisted', false)
            ->whereNotNull('published_at')
            ->get();
         */

        /*
        return Page::whereHas('versions', function($query) {
            $query->where('parent_page_id', 1)
                ->where('unlisted', false)
                ->whereNotNull('published_at');
        })
        ->with('versions')
        ->get()
        ->append(['full_slug', 'version']);
         */

        /*
             $home_page = Page::find(1);
             if ($home_page instanceof Page) {
                 $pages = $home_page->getPages()
                              ->filter(function ($page) {
                                  $version = $page->getActiveVersion();
                                  if (!$version) {
                                      return false;
                                  }
                                  if (editing()) {
                                      return !$version->unlisted;
                                  }
                                  if ((request('preview') && (auth()->user()?->hasRole('pages-editor')) || request()->hasValidSignature())) {
                                      return !$version->unlisted;
                                  }
                                  return $version->published_at && !$version->unlisted;
                              })
                              ->sortBy(function ($page) {
                                  return $page->getActiveVersion()->sort_order;
                              })
                              ->values()
                              ->append(['full_slug', 'version', 'sub_menu']);
                 return $pages;
             } else {
                 return null;
             }
         */
    }

    /*
    public static function getCommunityPages()
    {
        $page_names = [
            'Parents',
            'Students',
            'Staff',
            'Alumni',
            'News',
        ];

        $pages = collect();

        return cache()->tags(['menu'])->remember('community-pages', (60 * 60), function () use ($pages, $page_names) {
            foreach ($page_names as $page_name) {
                $pages->push(Page::whereHas('publishedVersion', function ($query) use ($page_name) {
                    $query->where('name', $page_name);
                })->first());
            }

            return $pages->filter(function ($page) {
                if (!$page->getActiveVersion()) {
                    return false;
                }
                return true;
            });
        });
    }
     */

    public static function getModules()
    {
        $pages = collect();

        if (!auth()->check()) {
            return $pages;
        }

        return cache()->tags(['nav-menu', cache_name(auth()->user())])->remember('modules-'.auth()->user()->id, (60 * 60), function () use ($pages) {
            if (auth()->user()->can('manage', Announcement::class)) {
                $pages->push([
                    'name' => 'Announcements',
                    'icon' => 'fas fa-bullhorn',
                    'url' => '/announcements-manage',
                    'description' => 'Create, edit and publish announcements',
                ]);
            }

            if (auth()->user()->can('manage', Blog::class)) {
                $pages->push([
                    'name' => 'Blogs',
                    'icon' => 'fas fa-blog',
                    'url' => '/blogs-manage',
                    'description' => 'Create, edit and publish blogs',
                ]);
            }

            if (auth()->user()->can('manage', Course::class)) {
                $pages->push([
                    'name' => 'Courses',
                    'icon' => 'fas fa-th-list',
                    'url' => '/courses-manage',
                    'description' => 'Create, edit and publish internal & external course information',
                ]);
            }

            if (auth()->user()->can('manage', Inquiry::class)) {
                $pages->push([
                    'name' => 'Inquiries',
                    'icon' => 'fas fa-question-circle',
                    'url' => '/inquiries',
                    'description' => 'View and respond to all inquiries',
                ]);
            }

            if (auth()->user()->can('manage', Livestream::class)) {
                $pages->push([
                    'name' => 'Livestreams',
                    'icon' => 'fab fa-youtube',
                    'url' => '/livestreams',
                    'description' => 'Create and update livestreams',
                ]);
            }

            if (auth()->user()->hasRole('admin')) {
                $pages->push([
                    'name' => 'Page Permissions',
                    'icon' => 'fas fa-user-lock',
                    'url' => '/permissions/pages',
                    'description' => 'Manage edit & publishing permissions for all pages',
                ]);
            }

            if (auth()->user()->can('manage', StaffProfile::class)) {
                $pages->push([
                    'name' => 'Person Profiles',
                    'icon' => 'fas fa-user-graduate',
                    'url' => '/staff-profiles-manage',
                    'description' => 'Create, edit and publish person bios across the website',
                ]);
            }

            if (auth()->user()->hasRole('admin')) {
                $pages->push([
                    'name' => 'Queue Monitor',
                    'icon' => 'fas fa-cog',
                    'url' => '/horizon',
                    'new_window' => true,
                    'description' => 'View and manage server jobs',
                ]);
            }

            if (auth()->user()->hasRole('admin')) {
                $pages->push([
                    'name' => 'Redirects',
                    'icon' => 'fas fa-signs-post',
                    'url' => '/page-redirects',
                    'description' => 'Manage redirects for old urls',
                ]);
            }

            if (auth()->user()->hasRole('admin')) {
                $pages->push([
                    'name' => 'Roles',
                    'icon' => 'fas fa-user-tag',
                    'url' => '/roles',
                    'description' => 'Manage roles for all users',
                ]);
            }

            if (auth()->user()->hasRole('admin')) {
                $pages->push([
                    'name' => 'Tags',
                    'icon' => 'fas fa-tag',
                    'url' => '/tags',
                    'description' => 'Create & update categories for pages, blogs, content and photos',
                ]);
            }

            if (auth()->user()->can('manage', TimetableContent::class)) {
                $pages->push([
                    'name' => 'Timetable',
                    'icon' => 'fas fa-table-cells',
                    'url' => '/timetable-contents-manage',
                    'description' => 'Manage content for the timetable content elements',
                ]);
            }

            if (auth()->user()->hasRole('admin')) {
                $pages->push([
                    'name' => 'Users',
                    'icon' => 'fas fa-users',
                    'url' => '/users',
                    'description' => 'Update user information including roles',
                ]);
            }

            return $pages;
        });
    }
}
