<?php

namespace brain\controller;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Slim\Views\Twig;
use brain\data\Book;
use brain\data\Session;
use brain\data\Settings;
use brain\data\Themes;
use brain\utility\Setup;

class DashControl
{
    public static function start(
        ServerRequestInterface $request,
        ResponseInterface $response,
        array $args
    ): ResponseInterface {
        $view = Twig::fromRequest($request);
        $pageOptions = [];
        $template = "";
        if (Setup::status()) {
            switch (isset($args["second"]) ? $args["second"] : "index") {
                case "settings":
                    if (Session::active()) {
                        $config = new Settings();
                        $settings = $config->getSettings();
                        $themes = (new Themes())->getThemes(); //$config->getThemes();
                        $template = "dash/settings.twig";
                        $member = Session::get("member");
                        $form_token = Session::get("form_token");
                        $updated = new \Moment\Moment($settings["global"]["last_backup"]);
                        $pageOptions = [
                        "title" => "Dash Settings",
                        "private" => $settings["global"]["private"],
                        "renderOnSave" => $settings["global"]["renderOnSave"],
                        "background" => $settings["global"]["background"],
                        "member" => $member,
                        "ftoken" => $form_token,
                        "siteTitle" => $settings["global"]["title"],
                        "baseUrl" => $settings["global"]["base_url"],
                        "desc" => $settings["global"]["descriptions"],
                        "lastBackup" => $updated->format("Y M D d"),
                        "currentTheme" => $settings["global"]["theme"],
                        "themes" => $themes,
                        "apiStatus" => isset($settings["global"]["externalAPI"])
                          ? $settings["global"]["externalAPI"]
                          : "false",
                        "dynamicRenderStatus" => isset(
                            $settings["global"]["dynamicRender"]
                        )
                          ? $settings["global"]["dynamicRender"]
                          : "false",
                          "mailOption" => $settings["email"]["active"],
                          "mailConfig" => $settings["email"],
                          "status" => Session::active(),
                        ];
                    } else {
                        header("Location: /dashboard");
                        die();
                    }

                    break;
                case "navigation":
                    if (Session::active()) {
                        $config = new Settings();
                        $settings = $config->getSettings();
                        $template = "dash/navigation.twig";
                        $pageOptions = [
                        "title" => "Edit Dash Navigation",
                        "status" => Session::active(),
                        "menu" => $settings["menu"],
                        ];
                    } else {
                        header("Location: /dashboard");
                        die();
                    }
                    break;
                case "pages":
                    if (Session::active()) {
                        $currentPage = isset($args["fourth"]) ? $args["fourth"] : 1;
                        $filter = isset($args["third"]) ? $args["third"] : "all";
                        $data = (new Book())->getPages($currentPage, 4, $filter);
                        $template = "dash/book.twig";
                        $pageOptions = [
                        "title" => "Contents",
                        "entryCount" => $data["entryCount"],
                        "numOfPages" => $data["numOfPages"],
                        "currentPage" => $currentPage,
                        "filter" => $data["paginate"]["sort"],
                        "stats" => $data["stats"],
                        "pages" => $data["pages"],
                        "paginate" => $data["paginate"],
                        "status" => Session::active(),
                        ];
                    } else {
                        header("Location: /dashboard");
                        die();
                    }
                    break;
                case "page":
                    if (Session::active()) {
                        $template = "dash/page-edit.twig";
                        $mode = $args["third"];
                        $uuid = $args["fourth"];

                        switch ($mode) {
                            case "edit":
                                $page = (new Book())->findPageById($uuid);
                                $views = [];
                                if (str_contains($page["layout"], "index")) {
                                    $views = (new Themes())->getCustomIndex();
                                } else {
                                    $views = (new Themes())->getCustomViews();
                                }

                                $imageList = explode(",", $page["feature"]);
                                $fileList = explode(",", $page["files"]);

                                $images = [];
                                $files = [];
                                foreach ($imageList as $item) {
                                    $image = trim($item);
                                    if (!empty($image)) {
                                        array_push($images, $image);
                                    }
                                }

                                foreach ($fileList as $item) {
                                    $file = trim($item);
                                    if (!empty($file)) {
                                        array_push($files, $file);
                                    }
                                }

                                $pageOptions = [
                                "title" => "Fipamo | Edit Page",
                                "page" => $page,
                                "mode" => $mode,
                                "token" => Session::get("form_token"),
                                "status" => Session::active(),
                                "images" => $images,
                                "files" => $files,
                                "views" => $views,
                                ];
                                break;
                            case "preview":
                                $config = new Settings();
                                $settings = $config->getSettings();
                                $loader = new \Twig\Loader\FilesystemLoader(
                                    "../content/themes"
                                );
                                $display = new \Twig\Environment($loader, []);

                                $book = new Book();
                                $page = $book->findPageById($uuid);
                                $pageOptions = Sorting::page($page);
                                $preview =
                                $settings["global"]["theme"] .
                                "/" .
                                $page["layout"] .
                                ".twig";
                                $html = $display->render($preview, $pageOptions);
                                $response->getBody()->write($html);
                                return $response;
                            break;
                            default:
                                $pageOptions = [
                                "title" => "Fipamo | Create Page",
                                "token" => Session::get("form_token"),
                                "mode" => $mode,
                                "status" => Session::active(),
                                ];
                                break;
                        }
                    } else {
                        header("Location: /dashboard");
                        die();
                    }
                    break;
                case "logout":
                    Session::kill();
                    header("Location: /dashboard");
                    die();
                break;
                case "reset-password":
                    $template = "dash/reset-password.twig";
                    $pageOptions = [
                    "title" => "Reset Password",
                    ];
                    break;

                default:
                    $template = "dash/start.twig";
                    if (Session::active()) {
                        $pageOptions = [
                        "title" => "Welcome Back",
                        "status" => Session::active(),
                        "data" => (new Book())->getPages(1, 4),
                        ];
                    } else {
                        $pageOptions = [
                        "title" => "Welcome to Fipamo",
                        "status" => Session::active(),
                        ];
                    }
                    break;
            }
        } else {
            $template = "dash/init.twig";
            $pageOptions = ["title" => "Fipamo Setup"];
        }

        return $view->render($response, $template, $pageOptions);
    }
}