<?php

use App\Libs\Facades\Localization;
use Illuminate\Support\Facades\Cache;

class Menu extends BaseModel
{

    public function menuItems()
    {
        return $this->hasMany("MenuItem");
    }

    public function website()
    {
        return $this->belongsTo("Website");
    }

    public function resetCache()
    {
        $langs = Localization::getAllLanguages();
        foreach ($langs as $lang) {
            $menuCacheKey = "menus[$this->id][$lang->id]";
            Cache::forget($menuCacheKey);
        }
    }

    public function getStructuredItemsFrontend()
    {
        $activeLang = Localization::getActiveLocale();
        $menuCacheKey = "menus[$this->id][$activeLang]";

        $frontendStucturedMenu = Cache::get($menuCacheKey);

        if ($frontendStucturedMenu) {
            return $frontendStucturedMenu;
        }

        $menuItems = $this->menuItems()->with(['Entry', 'BigMenu', 'WebsiteObject'])->orderBy('position')->get();
        $list = array();

        foreach ($menuItems as $menuItem) {
            if ((!$menuItem->websiteObject && $menuItem->website_object_id) || (!$menuItem->entry && $menuItem->entry_id)) {
                // Reference object has been deleted - don't show item
                continue;
            }

            $simpleItem = new stdClass();
            $simpleItem->id = $menuItem->id;
            $simpleItem->parent_id = $menuItem->parent_id;
            $simpleItem->menu_id = $menuItem->menu_id;
            $simpleItem->target = $menuItem->target;
            $simpleItem->position = $menuItem->position;
            $simpleItem->title = $menuItem->title;
            $simpleItem->url = $menuItem->url;
            $simpleItem->bigMenu = null;

            if ($menuItem->websiteObject) {
                if ($menuItem->websiteObject->status !== 'published' || $menuItem->websiteObject->lang_status !== 'published') {
                    continue;
                }
                $simpleItem->url = $menuItem->websiteObject->lang_uri;
                if ($menuItem->use_object_title) {
                    $simpleItem->title = $menuItem->websiteObject->objectable->title;
                }
            } else if ($menuItem->entry) {
                $simpleItem->url = $menuItem->entry->lang_uri;
            } else if ($menuItem->bigMenu) {
                $simpleItem->bigMenu = $menuItem->bigMenu;
            }

            $list[$menuItem->id] = $simpleItem;
        }

        $frontendStucturedMenu = $this->_structureMenu($list);
        Cache::set($menuCacheKey, $frontendStucturedMenu);
        return $frontendStucturedMenu;
    }

    public function getStructuredItems()
    {
        $menuItems = $this->menuItems()->with(['Entry', 'BigMenu', 'WebsiteObject'])->orderBy('position')->get();
        $list = array();

        foreach ($menuItems as $menuItem) {
            if (!$menuItem->type) {
                if ($menuItem->website_object_id) {
                    $menuItem->type = 'object';
                    if (!$menuItem->websiteObject) {
                        $menuItem->refDeleted = true;
                    }
                } else if ($menuItem->entry_id) {
                    $menuItem->type = 'page';
                    if (!$menuItem->entry) {
                        $menuItem->refDeleted = true;
                    }
                } else if ($menuItem->big_menu_id) {
                    $menuItem->type = 'content';
                } else {
                    $menuItem->type = 'link';
                }
            }
            $list[$menuItem->id] = $menuItem;
        }
        return $this->_structureMenu($list);
    }

    private function _structureMenu($listItems, $root = null)
    {
        $return = array();
        foreach ($listItems as $id => $menuItem) {
            if ($menuItem->parent_id == $root) {
                unset($listItems[$id]);
                $menuItem->children = $this->_structureMenu($listItems, $menuItem->id);
                $return[] = $menuItem;
            }
        }
        return $return;
    }
}
