<?php

namespace App\Services;

use Carbon\Carbon;

class MaintenanceService
{
    protected $settings;

    public function __construct(SettingsService $settingsService)
    {
        $this->settings = $settingsService;
    }

    public function createBackUp()
    {
        //make sure back directory is there
        $stamp = Carbon::now()->format("YmdGis");
        if (!is_dir('../content/backups')) {
            mkdir('../content/backups', 0755, true);
        }
        //creat backup zip
        $zip = new \ZipArchive();

        $zip->open(
            '../content/backups/backup-' . $stamp . '.zip',
            \ZipArchive::CREATE | \ZipArchive::OVERWRITE
        );
        //gather data and path info for md pages
        $pagePath  = '../content/pages';
        $yearPaths = glob($pagePath . '/*', GLOB_ONLYDIR);
        foreach ($yearPaths as $years) {
            $year = explode('/', $years);
            //grap the index and save it
            if (trim($year[3]) == 'start') {
                $options = [
                    'add_path'        => 'content/pages/' . $year[3] . '/',
                    'remove_all_path' => true,
                ];
                $zip->addGlob($years . '/*.md', GLOB_BRACE, $options);
            }
            $monthsPath = glob($pagePath . '/' . $year[3] . '/*', GLOB_ONLYDIR);
            foreach ($monthsPath as $months) {
                $month = explode('/', $months);
                //once info is collected, add md pages to zip
                $options = [
                    'add_path'        => 'content/pages/' . $year[3] . '/' . $month[4] . '/',
                    'remove_all_path' => true,
                ];
                $zip->addGlob($months . '/*.md', GLOB_BRACE, $options);
            }
        }
        //gather paths for blog images
        $blogImages = [];
        $dir        = new \RecursiveDirectoryIterator('../public/assets/images/blog');
        $flat       = new \RecursiveIteratorIterator($dir);
        $files      = new \RegexIterator($flat, '/\.png|jpg|gif$/i');
        foreach ($files as $file) {
            $blogImages[] = ['path' => $file->getPath(), 'file' => $file->getFilename()];
        };

        //gather paths for user images
        $userImages = [];
        $dir        = new \RecursiveDirectoryIterator('../public/assets/images/user');
        $flat       = new \RecursiveIteratorIterator($dir);
        $files      = new \RegexIterator($flat, '/\.png|jpg|gif$/i');
        foreach ($files as $file) {
            $userImages[] = ['path' => $file->getPath(), 'file' => $file->getFilename()];
        };

        //gather paths for blog documents
        $blogDocs = [];
        $dir      = new \RecursiveDirectoryIterator('../public/assets/docs/blog');
        $flat     = new \RecursiveIteratorIterator($dir);
        $files    = new \RegexIterator($flat, '/\.txt|pdf|rtf$/i');
        foreach ($files as $file) {
            $blogDocs[] = ['path' => $file->getPath(), 'file' => $file->getFilename()];
        };
        //gather paths for blog videos
        $blogVids = [];
        $dir      = new \RecursiveDirectoryIterator('../public/assets/video/blog');
        $flat     = new \RecursiveIteratorIterator($dir);
        $files    = new \RegexIterator($flat, '/\.mp4$/i');
        foreach ($files as $file) {
            $blogVids[] = ['path' => $file->getPath(), 'file' => $file->getFilename()];
        };

        //add directory for settings and save them
        $zip->addEmptyDir('config');
        $zip->addEmptyDir('assets');
        $zip->addFile(env('SETTINGS_PATH'), 'config/settings.json');
        $zip->addFile(env('FOLKS_PATH'), 'config/folks.json');
        $zip->addFile(env('TAGS_PATH'), 'config/tags.json');
        // create temp files for image lists
        file_put_contents('../content/backups/blog_images_temp.json', json_encode($blogImages));
        file_put_contents('../content/backups/user_images_temp.json', json_encode($userImages));
        file_put_contents('../content/backups/blog_docs_temp.json', json_encode($blogDocs));
        file_put_contents('../content/backups/blog_vids_temp.json', json_encode($blogVids));
        //add to zip
        $zip->addFile('../content/backups/blog_images_temp.json', 'assets/blog_images.json');
        $zip->addFile('../content/backups/user_images_temp.json', 'assets/user_images.json');
        $zip->addFile('../content/backups/blog_docs_temp.json', 'assets/blog_docs.json');
        $zip->addFile('../content/backups/blog_vids_temp.json', 'assets/blog_videos.json');
        //save zip file
        $zip->close();
        //clean up temp files
        unlink('../content/backups/blog_images_temp.json');
        unlink('../content/backups/user_images_temp.json');
        unlink('../content/backups/blog_docs_temp.json');
        unlink('../content/backups/blog_vids_temp.json');

        //update settings file with latest back up date
        $this->settings->updateGlobalData('last_backup', $stamp);

        return ['message' => "Backup created. THIS IS A SAFE SPACE!"];
    }
}