<?php

namespace App\Utilities;

use App\Models\Page;
use App\Models\ContentElement;

//use Barryvdh\Snappy\Facades\SnappyPdf as PDF;

class PageResponse
{
    public function view($page, $view, array $attributes = null)
    {
        if (!$page) {
            $page = Page::getHomePage();
        }

        $page->load('version');

        if (request('preview') && request()->hasValidSignature()) {
            $preview = true;
            session()->put('preview_version_id', $page->version->id);
        } else {
            $preview = false;
            session()->forget('preview_version_id');
        }

        // if the page hasn't been published and we are not logged in dont show
        if (!$page->published_at && !auth()->check() && !$preview) {
            return abort(404);
        }

        if ($page->hasViewPermissions() && !$preview) {
            if (!auth()->check()) {
                session()->put('url.intended', request()->fullUrl());
                return redirect('/login')->with(['error' => 'Please login to view that page']);
            }
            if (!auth()->user()->can('view', $page)) {
                return redirect('/')->with(['error' => 'You do not have permission to view that page']);
            }
        }

        if ($page->version?->redirect && !editing() && !request()->wantsJson() && !$preview) {
            return redirect()->away($page->version->redirect);
        }

        if ($page->version?->signed_url && !editing() && !$preview) {
            if (!request()->hasValidSignature()) {
                return redirect('/')->with(['error' => 'You do not have permission to view that page']);
            }
        }

        if (auth()->check()) {
            if (request('editing') && auth()->user()->can('update', $page)) {
                if (request('editing') === 'true') {
                    auth()->user()->enableEditing();
                } else {
                    auth()->user()->disableEditing();
                }
            }
        }

        $page = $this->loadPageAttributes($page);

        $page_vars = [
            'page' => $page,
        ];

        if ($attributes) {
            $page_vars = array_merge($page_vars, $attributes);
        }

        if (request()->wantsJson() && !$preview) {
            if (request('render')) {
                return response()->json(['html' => view('content', $page_vars)->render() ]);
            }

            return response()->json($page_vars)
                    ->header('Vary', 'Accept');
        }

        /*
         * As of July '21 wkhtmltopdf does not support css grid. It's also
         * not displaying photos correctly, they are missing due to some issue with
         * absolute positioning it looks like. For now PDFs are out. Print via the browser
         * to PDF if required.
         *
        if (request('pdf')) {
            $pdf = PDF::loadView($view, $page_vars)->setOption('print-media-type', true);
            $filename = $page->version->title ?? $page->version->name.' - '.env('APP_NAME');
            return $pdf->download($filename);
        }
         */

        if (!auth()->check() && request('editing')) {
            session()->put('url.intended', url()->current().'?editing=true');
            return redirect('/login')->with(['error' => 'Please login to review that page']);
        }

        if (auth()->user()?->can('update', $page) && editing() && !request('preview')) {
            return view('pages.edit', $page_vars);
        } else {
            /*
            if (!auth()->check()) {
                $cache_name = cache_name($page).'-v'.$page->version->id;

                return cache()->tags([cache_name($page)])->rememberForever($cache_name, function () use ($view, $page_vars) {
                    return view($view, $page_vars)->render();
                });
            }
             */

            return view($view, $page_vars);

            /*
             * Page caching
             * This is the safest way to do this but the more heavy handed
             * Ideally each content element is cached but that requires unescaped
             * rendering in the view which is risky

            if (!env('production')) {
                return view($view, $page_vars);
            }

            $cache_name = cache_name($page).'-v'.$page->version->id;

            if (auth()->check()) {
                $cache_name .= '-user'.auth()->user()->id;
            } else {
                $cache_name .= '-guest';
            }

            return cache()->tags([cache_name($page)])->rememberForever($cache_name, function () use ($view, $page_vars) {
                return view($view, $page_vars)->render();
            });
            */
        }
    }

    public function loadPageAttributes($page)
    {
        // we do this just incase a version was created for the first time just before loading attributes
        $page->load('version');
        $page->append('content');

        if (editing() && !request('preview')) {
            //$page->refresh();
            $page->load(
                'versions',
                'versions.publishingRequestedUser',
                'versions.publisher',
                'tags',
                'publishedVersion',
                'version.publishingRequestedUser',
            );

            if ($page->type === 'page') {
                $page->load('pageSlugs');
                $page->append('footer_fg_photo', 'footer_bg_photo', 'footer_color', 'parent_page_ids');
            }

            $page->append('has_permissions');
        }

        $page->appendAttributes();

        return $page;
    }
}
