<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;

use Illuminate\Support\Arr;
use App\Models\Page;
use App\Models\Blog;
use App\Models\Photo;
use App\Traits\HasFooterTrait;
use App\Utilities\PageLink;

class Version extends Model
{
    use HasFactory;
    use HasFooterTrait;

    //protected $with = ['footerFgPhoto', 'footerBgPhoto'];

    protected $casts = [
        'unlisted' => 'boolean',
        'search_exclude' => 'boolean',
        'show_sub_menu' => 'boolean',
        'signed_url' => 'boolean',
        'published_at' => 'datetime',
        'publish_at' => 'datetime',
        'sibling_nav' => 'boolean',
        'randomize' => 'integer',
    ];

    public function photos()
    {
        return $this->morphMany(Photo::class, 'content');
    }

    public function publisher()
    {
        return $this->belongsTo(User::class, 'publisher_id');
    }

    public function getSearchFieldsAttribute()
    {
        return [
            'name',
            'title',
            'slug',
            'description',
        ];
    }

    public function saveVersion($versionable, array $input, $id = null)
    {
        if ($id) {
            $version = Version::findOrFail($id);
        } else {
            $version = new Version();
            $version->version_number = Arr::get($input, 'version_number');
        }

        $protected = $versionable->protected;

        $version->versionable_type = get_class($versionable);
        $version->versionable_id = $versionable->id;

        if ($protected) {
            $version->name = $versionable->version->name;
            $version->slug = $versionable->version->slug;
        } else {
            $version->name = Arr::get($input, 'name');
            $version->slug = Arr::get($input, 'slug');
        }

        // Not sure if we need to set a parent for blogs?
        if (!$protected && Arr::get($input, 'parent_page_id')) {
            $parent_page = Page::find(Arr::get($input, 'parent_page_id'));
            if ($parent_page instanceof Page) {
                $version->parent_page_id = $parent_page->id;
            } else {
                $version->parent_page_id = null;
            }
        } else {
            $version->parent_page_id = $versionable->version ? $versionable->version->parent_page_id : 0; // the home page needs 0
        }

        $version->title = Arr::get($input, 'title');
        $version->description = Arr::get($input, 'description');
        $version->theme = Arr::get($input, 'theme');
        $version->sort_order = Arr::get($input, 'sort_order');
        $version->unlisted = Arr::get($input, 'unlisted') == true ? true : false;
        $version->search_exclude = Arr::get($input, 'search_exclude') == true ? true : false;
        $version->show_sub_menu = Arr::get($input, 'show_sub_menu') == true ? true : false;
        $version->footer_color = Arr::get($input, 'footer_color');
        $version->publish_at = Arr::get($input, 'publish_at');
        $version->redirect = Arr::get($input, 'redirect'); // previously it was only admins who could save a redirect
        $version->signed_url = Arr::get($input, 'signed_url') == true ? true : false;
        $version->sibling_nav = Arr::get($input, 'sibling_nav') == true ? true : false;
        $version->randomize = Arr::get($input, 'randomize');
        $version->save();

        if (Arr::get($input, 'footer_fg_photo')) {
            $footer_fg_photo = (new Photo())->savePhoto(Arr::get($input, 'footer_fg_photo'), $version->footer_fg_photo_id, $version);
            $version->footer_fg_photo_id = $footer_fg_photo->id;
            $version->save();
        }

        if (Arr::get($input, 'footer_bg_photo')) {
            $footer_bg_photo = (new Photo())->savePhoto(Arr::get($input, 'footer_bg_photo'), $version->footer_bg_photo_id, $version);
            $version->footer_bg_photo_id = $footer_bg_photo->id;
            $version->save();
        }

        cache()->tags([cache_name($version)])->flush();
        return $version;
    }

    public function versionable()
    {
        return $this->morphTo();
    }

    public function publishingRequestedUser()
    {
        return $this->belongsTo(User::class, 'publishing_requested_user_id');
    }

    public function publish(User $publisher = null)
    {
        $this->published_at = now();
        if (auth()->check()) {
            $this->publisher_id = auth()->user()->id;
        } elseif ($publisher) {
            $this->publisher_id = $publisher->id;
        }
        $this->save();

        cache()->tags([cache_name($this)])->flush();

        if ($this instanceof Page) {
            cache()->tags([cache_name($this->getParentPage())])->flush();
            $page->getPages()->each(function ($sub_page) {
                cache()->tags([cache_name($sub_page)])->flush();
            });
        }

        return $this;
    }

    public function footerFgPhoto()
    {
        return $this->belongsTo(Photo::class, 'footer_fg_photo_id');
    }

    public function footerBgPhoto()
    {
        return $this->belongsTo(Photo::class, 'footer_bg_photo_id');
    }

    public function getFooterFgPhoto()
    {
        $value = $this->footerFgPhoto;
        if ($value) {
            return $value;
        } else {
            return cache()->tags(['page-1'])->rememberForever('page-1-footer-fg-photo', function () {
                return Page::find(1)->version->footerFgPhoto;
            });
            /*
            if ($this->parent_page_id > 0) {
                return cache()->tags([cache_name($this)])->rememberForever(cache_name($this).'-parent-footer-fg-photo', function () {
                    $page = Page::find($this->parent_page_id);
                    if ($page->version) {
                        return $page->version->getFooterFgPhoto();
                    } else {
                        return null;
                    }
                });
            } else {
                return null;
            }
             */
        }
    }

    public function getFooterBgPhoto()
    {
        $value = $this->footerBgPhoto;
        if ($value) {
            return $value;
        } else {
            return cache()->tags(['page-1'])->rememberForever('page-1-footer-bg-photo', function () {
                return Page::find(1)->version->footerBgPhoto;
            });
            /*
            if ($this->parent_page_id > 0) {
                return cache()->tags([cache_name($this)])->rememberForever(cache_name($this).'-parent-footer-bg-photo', function () {
                    $page = Page::find($this->parent_page_id);
                    if ($page->version) {
                        return $page->version->getFooterBgPhoto();
                    } else {
                        return null;
                    }
                });
            } else {
                return null;
            }
             */
        }
    }

    public function getFooterColor()
    {
        $value = $this->footer_color;
        if ($value) {
            return $value;
        } else {
            return cache()->tags(['page-1'])->rememberForever('page-1-footer-color', function () {
                return Page::find(1)->version->footer_color;
            });
            /*
            if ($this->parent_page_id > 0) {
                return cache()->tags([cache_name($this)])->rememberForever(cache_name($this).'-parent-footer-color', function () {
                    $page = Page::find($this->parent_page_id);
                    if ($page->version) {
                        return $page->version->getFooterColor();
                    } else {
                        return null;
                    }
                });
            } else {
                return null;
            }
             */
        }
    }

    public function parentPage()
    {
        if ($this->versionable_type === get_class(new Page())) {
            return $this->belongsTo(Page::class, 'parent_page_id');
        }
        return null;
    }

    public function getRedirectAttribute($value)
    {
        return PageLink::convertLink($value);
    }
}
