<?php

namespace App\Services\Data;

use Carbon\Carbon;
use App\Services\Assets\DocService;

use function _\find;
use function _\pull;

class SettingsService
{
    protected $settings;
    protected $tags;
    protected $docs;
    protected $contents;

    public function __construct(DocService $docService, ContentService $contentService)
    {
        if (file_exists(env('TAGS_PATH'))) {
            $this->tags = json_decode(file_get_contents(env('TAGS_PATH')), true);
        } else {
            $this->tags = [];
        }

        $this->docs     = $docService;
        $this->contents = $contentService;
    }

    protected function loadSettings()
    {
        $settings = [];
        //if config files aren't avaiable, load templates
        if (file_exists(env('SETTINGS_PATH'))) {
            $settings = json_decode(file_get_contents(env('SETTINGS_PATH')), true);
        } else {
            $settings = json_decode(
                file_get_contents('../content/init/settings-template.json'),
                true
            );
        }
        return $settings;
    }

    public function getSettings()
    {
        return $this->loadSettings();
    }

    public function getGlobal()
    {
        $this->settings = $this->loadSettings();
        return $this->settings['global'];
    }

    public function getEmail()
    {
        $this->settings = $this->loadSettings();
        return $this->settings['email'];
    }

    public function getMenu()
    {
        $this->settings = $this->loadSettings();
        return $this->settings['menu'];
    }

    public function getTags()
    {
        return $this->tags;
    }

    public function updatePageIndex()
    {
        $this->settings = $this->loadSettings();
        $this->settings['library_stats']['current_index']++;
        $this->docs->writeSettings($this->settings);
    }

    public function updateGlobalData($key, $value)
    {
        $this->settings                 = $this->loadSettings();
        $this->settings['global'][$key] = $value;
        $this->docs->writeSettings($this->settings);
    }

    public function updateMenu($body)
    {
        $settings = $this->loadSettings();
        //$menu = $settings["menu"];
        $item = [
            'title' => $body->title,
            'id'    => $body->id,
            'uuid'  => $body->uuid,
            'slug'  => $body->slug,
            'path'  => $body->path,
        ];
        if ($body->menu == 'true') {
            if (!find($settings['menu'], ['uuid' => $item['uuid']])) {
                array_push($settings['menu'], $item);
            }
        } else {
            if (find($settings['menu'], ['uuid' => $item['uuid']])) {
                pull($settings['menu'], $item);
            }
        }
        $this->docs->writeSettings($settings);
    }

    public function updateTags($update)
    {
        $this->docs->writeSettings($update, env('TAGS_PATH'));
    }

    public function sync($data)
    {
        $settings                            = $this->getSettings();
        $settings['global']['base_url']      = $data->global->base_url;
        $settings['global']['title']         = $data->global->title;
        $settings['global']['descriptions']  = $data->global->descriptions;
        $settings['global']['private']       = $data->global->private;
        $settings['global']['renderOnSave']  = $data->global->renderOnSave;
        $settings['global']['theme']         = $data->global->theme;
        $settings['global']['externalAPI']   = $data->global->externalAPI;
        $settings['global']['dynamicRender'] = $data->global->dynamicRender;

        //$settings['email']['active']  = $data->email->active;
        //$settings['email']['smtp']    = $data->email->smtp;
        //$settings['email']['mailgun'] = $data->email->mailgun;

        return $this->docs::writeSettings($settings);
    }

    public function navSync($data)
    {
        $settings = $this->loadSettings();
        $pages    = $this->contents->loadAllPages();
        $remove   = $data->remove;
        $result   = [];
        //if remove contains id, find nav item page and set menu to false
        if ($remove != null || $remove != '') {
            $page         = $pages->where('uuid', $remove)->first();
            $page['menu'] = 'false';
            $page['published']
            ? ($page['published'] = 'true')
            : ($page['published'] = 'false');
            $page['featured']
            ? ($page['featured'] = 'true')
            : ($page['featured'] = 'false');
            $page['deleted']
            ? ($page['deleted'] = 'true')
            : ($page['deleted'] = 'false');
            $updated         = Carbon::now();
            $created         = new Carbon($page['rawCreated']);
            $page['created'] = $created->format("Y-m-d\TH:i:sP");
            $page['updated'] = $updated->format("Y-m-d\TH:i:sP");

            if ($page['layout'] == 'index') {
                $writePath = '../content/pages/start/index.md';
            } else {
                $writePath = '../content/pages/' . $page['path'] . '/' . $page['slug'] . '.md';
            }
            try {
                $object            = (object) $page;
                $object->imageList = $page['feature'];
                $object->fileList  = $page['files'];
                $this->docs::writePages('write', $page['path'], $writePath, $this->docs::objectToMD($object));
            } catch (\Exception $e) {
                $result = [
                    'message' => 'Page Was Not Updated. Be cool ',
                    'type'    => 'pageUpdateError',
                    'error'   => $e->getMessage(),
                ];
                return $result;
            }
        }

        $settings['menu'] = [];
        $items            = $data->menu;
        foreach ($items as $item) {
            array_push($settings['menu'], [
                'title' => $item->title,
                'id'    => $item->id,
                'uuid'  => $item->uuid,
                'slug'  => $item->slug,
                'path'  => $item->path,
            ]);
        }
        try {
            $this->docs->writeSettings($settings);
            $result = [
                'message' => 'Navigation updated. Very slick!',
                'type'    => 'menuUpdated',
            ];
        } catch (\Exception $e) {
            $result = [
                'message' => 'Navigation Update Error. It\'ll be ok!',
                'type'    => 'menuUpdateError',
            ];
        };

        return $result;
    }
}