<?php

namespace App\Services;

use Illuminate\Support\Facades\File;

class RenderService
{
    private $sort;
    private $settings;
    private $contents;
    private $pageInfo;
    private $menu;
    private $background;
    private $theme;

    public function __construct(
        SortingService $sortingService,
        SettingsService $settingsService,
        ContentService $contentService
    ) {
        $this->sort     = $sortingService;
        $this->settings = $settingsService;
        $this->contents = $contentService;
        $this->theme    = $this->settings->getGlobal()['theme'];
    }

    public function publishAll()
    {
        $message       = [];
        $dynamicRender = $this->settings->getGlobal()['dynamicRender'];
        if (isset($dynamicRender) && $dynamicRender === 'true') {
            $message = [
                'message' => 'Auto Rendering is already enabled!',
                'type'    => 'RENDER_SUCCESS',
            ];
        } else {
            try {
                $this->archive();
                $this->tags();
                $this->pages();
                $message = [
                    'message' => 'Site Rendered. GOOD EFFORT',
                    'type'    => 'RENDER_SUCCESS',
                ];
            } catch (Error $error) {
                $message = [
                    'message' => 'Issue With Rendering. DONT PANIC',
                    'type'    => 'RENDER_ERROR',
                ];
            }
        }

        return $message;
    }

    public function archive()
    {
        $template = $this->theme . '.archive';
        $pageData = $this->sort->archive(false);
        $location = '../public/archives.html';
        File::put(
            $location,
            view($template)
                ->with($pageData)
                ->render()
        );
    }

    public function tags()
    {
        $data = $this->sort->tags(false);
        foreach ($data['tags'] as $item) {
            //$template    = 'tags.twig';
            $template = $this->theme . '.tags';
            $pageData = [
                'theme'         => $this->theme, // for theme kit
                'title'         => 'Pages Tagged as ' . $item['tag_name'],
                'dynamicRender' => $data['dynamicRender'],
                'info'          => $data['info'],
                'menu'          => $data['menu'],
                'pages'         => $item['pages'],
                'media'         => $data['media'],
            ];

            $location = '../public/tags/' . $item['slug'] . '.html';

            if (!is_dir('../public/tags')) {
                mkdir('../public/tags', 0755, true);
            }

            File::put(
                $location,
                view($template)
                    ->with($pageData)
                    ->render()
            );
        }
    }

    public function pages()
    {
        $pages = $this->contents->loadAllPages();
        foreach ($pages as $page) {
            $template;
            $page['layout'] == 'index' ?
                $template = $this->theme . '.index' :
                $template = $this->theme . '.page';

            $pageData = $this->sort->page($page, false);

            if (str_contains($page['layout'], 'index')) {
                $location = '../public/index.html';
            } else {
                // if page is a menu item, render the page on public root
                if ($page['menu'] == 'true') {
                    $location = '../public/' . $page['slug'] . '.html';
                } else {
                    $dir = '../public/' . $page['path'];
                    if (!is_dir($dir)) {
                        mkdir($dir, 0755, true);
                    }
                    $location = '../public/' . $page['path'] . '/' . $page['slug'] . '.html';
                }
            }
            File::put($location, view($template)->with($pageData)->render());
        }
    }
}