<?php

namespace App\Libs\Backoffice\Generic;

use App\Libs\Facades\Localization;
use App\Models\Website;
use Illuminate\Support\Facades\App;
use Silber\PageCache\Cache;

class UriHelper
{
    public static function updateUri($websiteObject, $model, $contentType, $save = true)
    {
        $cache = App::make(Cache::class);
        $uri = $contentType->getBaseUri($websiteObject->website_id);
        $languages = Localization::getAllLanguages();
        $defaultLang = Localization::getDefaultLocale();

        $defaultUri = "";
        if ($websiteObject->parent) {
            $parent = $websiteObject->parent;

            foreach ($languages as $lang) {
                $parentWoLang = $parent->languages->findByLocale($lang->id);
                $woLang = $websiteObject->languages->findByLocale($lang->id);
                $woLang->lang_uri = $parentWoLang->lang_uri.'/'.$woLang->lang_slug;
                if ($defaultLang == $lang->id) {
                    $defaultUri = $woLang->lang_uri;
                }
                if ($save) {
                    $woLang->save();
                }
                $cache->forget('/' . $lang->id . $woLang->lang_uri);
            }
        } else {
            if ($websiteObject->slug == 'home') {
                $defaultUri = '/';
                foreach ($languages as $lang) {
                    $woLang = $websiteObject->languages->findByLocale($lang->id);
                    $woLang->lang_uri = $defaultUri;
                    if ($save) {
                        $woLang->save();
                    }
                    $cache->forget('/' . $lang->id);
                }
            } else {
                if ($contentType->getTypeFilterField()) {
                    $filterField = $contentType->getTypeFilterField();
                    $filterType = $model->$filterField;
                    foreach ($languages as $lang) {
                        $woLang = $websiteObject->languages->findByLocale($lang->id);
                        if (is_array($uri[$filterType])) {
                            $uriLang = $uri[$filterType][$lang->id];
                        } else {
                            $uriLang = $uri[$filterType];
                        }
                        $woLang->lang_uri = $uriLang.'/'.$woLang->lang_slug;
                        if ($defaultLang == $lang->id) {
                            $defaultUri = $woLang->lang_uri;
                        }
                        if ($save) {
                            $woLang->save();
                        }
                        $cache->forget('/' . $lang->id . $woLang->lang_uri);
                    }
                } else {
                    foreach ($languages as $lang) {
                        $woLang = $websiteObject->languages->findByLocale($lang->id);

                        if (is_array($uri)) {
                            $uriLang = !empty($uri[$lang->id]) ? $uri[$lang->id] : $uri['en'];
                        } else {
                            $uriLang = $uri;
                        }
                        $woLang->lang_uri = $uriLang.'/'.$woLang->lang_slug;
                        if ($defaultLang == $lang->id) {
                            $defaultUri = $woLang->lang_uri;
                        }
                        if ($save) {
                            $woLang->save();
                        }
                        $cache->forget('/' . $lang->id . $woLang->lang_uri);
                    }
                }
            }
        }
        $websiteObject->uri = $defaultUri;
        if ($save) {
            $websiteObject->save();
        }

        $cache->forget($websiteObject->uri == '/' ? 'pc__index__pc' : $websiteObject->uri);
        if ($websiteObject->website_object_id) {
            $children = $websiteObject->children;
            foreach ($children as $child) {
                self::updateUri($child, $model, $contentType, $save);
            }
        }
    }

    public static function generateSlug($originSlug, Website $website = null, $langId)
    {
        $originSlug = urlize($originSlug);
        $slug = $originSlug;
        if (is_null($website)) {
            $website = Localization::getWebsite();
        }
        $slugCounter = 1;
        while ($website->hasSlug($slug, $langId) && $slugCounter <= 500) {
            $slug = $originSlug."-".$slugCounter;
            $slugCounter++;
        }

        if ($slugCounter == 100) {
            return false;
        } else {
            return $slug;
        }
    }
}
