<?php

namespace brain\utility;

use Carbon\Carbon;

use function _\find;

class SetUp
{
    public static function status()
    {
        if (file_exists('../config/settings.json')) {
            return true;
        } else {
            return false;
        }
    }

    public static function init($body)
    {
        //grab template files
        $newFolks = json_decode(
            file_get_contents('../config/init/folks-template.json'),
            true
        );
        $newSettings = json_decode(
            file_get_contents('../config/init/settings-template.json'),
            true
        );
        //get form values
        //$body = $request->getParsedBody();
        $handle = $body['new_member_handle'];
        $email  = $body['new_member_email'];
        $pass   = $body['new_member_pass'];
        $title  = $body['new_member_title'];

        $now = Carbon::now();
        //setup folks config
        $hash                    = password_hash($pass, PASSWORD_DEFAULT);
        $newFolks[0]['id']       = 0;
        $newFolks[0]['handle']   = $handle;
        $newFolks[0]['email']    = $email;
        $newFolks[0]['password'] = $hash;
        $newFolks[0]['key']      = password_hash($email, PASSWORD_DEFAULT);
        $newFolks[0]['secret']   = StringTools::randomString(12);
        $newFolks[0]['role']     = 'hnic';
        $newFolks[0]['created']  = $now->format("Y-m-d\TH:i:sP");
        $newFolks[0]['updated']  = $now->format("Y-m-d\TH:i:sP");
        //set up settings config
        $newSettings['global']['title'] = $title;

        //create index file
        //$rightNow = $now->format("Y-m-d\TH:i:sP");
        //var_dump($now->format("Y-m-d\TH:i:sP"));
        $index = [
            'id'        => 1,
            'uuid'      => StringTools::createUUID(),
            'title'     => 'FIRST!',
            'imageList' => '/assets/images/global/default-bg.jpg',
            'fileList'  => '',
            'path'      => 'content/pages/start',
            'layout'    => 'index',
            'tags'      => 'start, welcome',
            'author'    => $handle,
            'created'   => $now->format("Y-m-d\TH:i:sP"),
            'updated'   => $now->format("Y-m-d\TH:i:sP"),
            'deleted'   => 'false',
            'slug'      => 'first',
            'menu'      => 'false',
            'featured'  => 'false',
            'published' => 'true',
            'content'   => "# F**k Yes \n\nIf you're seeing this, you're up and running. NICE WORK!\n\nFrom here, feel free to start dropping pages to your heart's content.\n\nFor some tips about using Fipamo, check out the ![docs](https://code.playvicio.us/Are0h/Fipamo/wiki/02-Usage)\n\nAll good? Feel free to edit this page to whatever you want!\n\nYOU'RE THE CAPTAIN NOW.",
        ];

        $freshIndex = DocTools::objectToMD($index);

        //once all files created, write down

        DocTools::writeSettings('../config/settings.json', $newSettings);
        DocTools::writeSettings('../config/folks.json', $newFolks);
        DocTools::writeSettings('../config/tags.json', []);
        DocTools::writePages(
            'create',
            'start',
            '../content/pages/start/index.md',
            $freshIndex
        );

        //if there is an older session file, get rid of it
        if (is_file('../content/.session')) {
            unlink('../content/.session');
        }

        $result = ['type' => 'blogInitGood', 'message' => 'Site Created'];

        return $result;
    }

    public static function restore($request)
    {
        $result = [
            'type'    => 'requestLame',
            'message' => 'Still working on it.',
        ];
        $body = $request->getParsedBody();

        $backup = $request->getUploadedFiles();
        $file   = $backup['backup-upload'];
        //NOTE: If this fails check 'post_max_size' in php.ini
        $size = $file->getSize();
        $name = $file->getClientFileName();

        //park it so it can be read
        $file->moveTo('../content' . '/' . $name);

        //open it and get files to verify user
        $zip = new \ZipArchive();
        if ($zip->open('../content' . '/' . $name) === true) {
            $folks = json_decode($zip->getFromName('settings/folks.json'), true);
            $found = find($folks, ['handle' => $body['restore_member_handle']]);

            //if member is found in back up, check pass
            if ($found) {
                if (password_verify($body['restore_member_pass'], $found['password'])) {
                    //backup verified, restore site

                    //set new secret key for older folks configs
                    $newFolks = [];
                    if (!isset($found['secret'])) {
                        $found['secret'] = StringTools::randomString(12);
                    }
                    array_push($newFolks, $found);
                    //dump files in folder
                    $zip->extractTo('../content');

                    //move to appropriate spots
                    /*
                    rename(
                        "../content/settings/settings.json",
                        "../config/settings.json"
                    );
                    */

                    //load up old config file
                    $newConfig = json_decode(
                        file_get_contents('../content/settings/settings.json'),
                        true
                    );
                    //check for key, add if not there
                    if (!isset($newConfig['global']['externalAPI'])) {
                        $newConfig['global']['externalAPI'] = 'false';
                    }
                    //write new config file
                    DocTools::writeSettings('../config/settings.json', $newConfig);

                    //rename("../content/settings/folks.json", "../config/folks.json");
                    DocTools::writeSettings('../config/folks.json', $newFolks);

                    rename('../content/settings/tags.json', '../config/tags.json');

                    //images path for blog and user
                    $blogImagePath = '../public/assets/images/blog';
                    $userImagePath = '../public/assets/images/user';

                    //check to see if image dirs are empty, if not chill
                    if ($globs = glob($blogImagePath . '/*')) {
                        //directory not empty, relax
                    } else {
                        rename('../content/public/assets/images/blog', $blogImagePath);
                    }

                    if ($globs = glob($userImagePath . '/*')) {
                        //directory not empty, relax
                    } else {
                        rename('../content/public/assets/images/user', $userImagePath);
                    }

                    rename('../content/content/pages/', '../content/pages');

                    //legacy check for old file structure
                    if (is_file('../content/pages/index.md')) {
                        if (!is_dir('../content/pages/start')) {
                            //Directory does not exist, so lets create it.
                            mkdir('../content/pages/start', 0755, true);
                            //move start page to appropriate spot
                            rename(
                                '../content/pages/index.md',
                                '../content/pages/start/index.md'
                            );
                        }
                    } else {
                        //chill
                    }

                    //clean up

                    DocTools::deleteFolder('../content/settings');
                    DocTools::deleteFolder('../content/public');
                    DocTools::deleteFolder('../content/content');
                    $result = [
                        'type'    => 'requestGood',
                        'message' => 'Site Restored! Redirecting',
                    ];
                } else {
                    $result = [
                        'type'    => 'requestLame',
                        'message' => 'Check that password, champ.',
                    ];
                }
            } else {
                $result = [
                    'type'    => 'requestLame',
                    'message' => 'No member found by that name, hoss',
                ];
            }

            $zip->close();
            $zipPath = '../content/' . $name;
            //trash zip when done
            unlink($zipPath);
        } else {
            $result = [
                'type'    => 'requestLame',
                'message' => 'Could not open backup. RATS!',
            ];
        }
        return $result;
    }
}