<?php

namespace Modules\Utilities\Repositories;

use App\Models\User;
use App\Traits\UploadTheme;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\File;
use Modules\FrontendCMS\Entities\DynamicPage;
use Modules\Marketing\Entities\FlashDeal;
use Modules\Marketing\Entities\NewUserZone;
use Modules\Product\Entities\Brand;
use Modules\Product\Entities\Category;
use Modules\Product\Entities\ProductTag;
use Modules\Seller\Entities\SellerProduct;
use Illuminate\Support\Facades\Hash;

use Brian2694\Toastr\Facades\Toastr;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\Storage;
use Modules\Blog\Entities\BlogPost;
use Modules\GeneralSetting\Entities\GeneralSetting;
use Modules\ModuleManager\Entities\InfixModuleManager;
use Modules\ModuleManager\Entities\Module;
use Modules\Utilities\Entities\XmlSitemap;
use ZipArchive;

class UtilitiesRepository
{
    use UploadTheme;
    public function updateUtility($utilities)
    {
        if ($utilities == 'optimize_clear') {
            Artisan::call('optimize:clear');

            $dirname = base_path('/bootstrap/cache/');

            if (is_dir($dirname)) {
                $dir_handle = opendir($dirname);
            } else {
                $dir_handle = false;
            }
            if (!$dir_handle)
                return false;
            while ($file = readdir($dir_handle)) {
                if ($file != "." && $file != "..") {
                    if (!is_dir($dirname . "/" . $file))
                        unlink($dirname . "/" . $file);
                    else
                        File::deleteDirectory($dirname . '/' . $file);
                }
            }
            closedir($dir_handle);
        } elseif ($utilities == "clear_log") {
            array_map('unlink', array_filter((array)glob(storage_path('logs/*.log'))));
            array_map('unlink', array_filter((array)glob(storage_path('debugbar/*.json'))));
        } elseif ($utilities == "change_debug") {
            envu([
                'APP_DEBUG' => env('APP_DEBUG') ? "false" : "true"
            ]);
        } elseif ($utilities == "force_https") {
            envu([
                'FORCE_HTTPS' => env('FORCE_HTTPS') ? "false" : "true"
            ]);
        } elseif ($utilities == "xml_sitemap") {
        } else {
            return 'not_done';
        }
        return 'done';
    }

    public function get_xml_data($request)
    {
        $sitemaps = XmlSitemap::all();
        
        if(in_array('all', $request->sitemap)){
            foreach($sitemaps as $map){
                $map->update([
                    'status' => 1
                ]);
            }
        }else{
            foreach($sitemaps as $map){
                $map->update([
                    'status' => 0
                ]);
            }

            if (in_array('pages', $request->sitemap)) {
                $sitemaps->where('type', 'pages')->first()->update([
                    'status' => 1
                ]);
            }
            if (in_array('products', $request->sitemap)) {
                $sitemaps->where('type', 'products')->first()->update([
                    'status' => 1
                ]);
            }
    
            if (in_array('categories', $request->sitemap)) {
                $sitemaps->where('type', 'categories')->first()->update([
                    'status' => 1
                ]);
            }
    
            if (in_array('brands', $request->sitemap)) {
                $sitemaps->where('type', 'brands')->first()->update([
                    'status' => 1
                ]);
            }
    
            if (in_array('blogs', $request->sitemap)) {
                $sitemaps->where('type', 'blogs')->first()->update([
                    'status' => 1
                ]);
            }
    
            if (in_array('tags', $request->sitemap)) {
                $sitemaps->where('type', 'tags')->first()->update([
                    'status' => 1
                ]);
            }
            if (in_array('flash_deal', $request->sitemap)) {
                $sitemaps->where('type', 'flash_deal')->first()->update([
                    'status' => 1
                ]);
            }
            if (in_array('new_user_zone', $request->sitemap)) {
                $sitemaps->where('type', 'new_user_zone')->first()->update([
                    'status' => 1
                ]);
            }
        }
        
        return true;
    }

    public function xml_sitemap_public(){
        $sitemaps = XmlSitemap::where('status', 1)->where('type', '!=', 'all')->get();
        $data = [];
        foreach($sitemaps as $map){
            if($map->type == 'pages'){
                $data['pages'] = DynamicPage::all();
            }
            if($map->type == 'products'){
                $data['products'] = SellerProduct::where('status', 1)->activeSeller()->get();
            }
            if($map->type == 'categories'){
                $data['categories'] = Category::where('status', 1)->get();
            }
            if($map->type == 'brands'){
                $data['brands'] = Brand::where('status', 1)->get();
            }
            if($map->type == 'blogs'){
                $data['blogs'] = BlogPost::where('status', 1)->get();
            }
            if($map->type == 'tags'){
                $data['tags'] = ProductTag::distinct()->with('tag')->get(['tag_id']);
            }
            if($map->type == 'flash_deal'){
                $data['flash_deal'] = FlashDeal::where('status', 1)->first();
            }
            if($map->type == 'new_user_zone'){
                $data['new_user_zone'] = NewUserZone::where('status', 1)->first();
            }
        }
        return $data;
    }

    public function getSitemapConfig(){
        return XmlSitemap::all();
    }

    public function reset_database($request)
    {
        $user = DB::table('users')->where('id', 1)->first();
        $data = (array) $user;
        $data['lang_code'] = 'en';
        $data['currency_id'] = 2;
        $data['currency_code'] = "USD";
        $data['is_verified'] = 1;
        $infix_modules = InfixModuleManager::all();
        $setting = [
            'system_domain' => app('general_setting')->system_domain,
            'copyright_text' => app('general_setting')->copyright_text,
            'software_version' => app('general_setting')->software_version,
            'system_version' => app('general_setting')->system_version
        ];
        $modules = Module::all();
        Artisan::call('migrate:fresh',array('--force' => true));
        User::where('id', 1)->update($data);
        InfixModuleManager::query()->truncate();
        Module::query()->truncate();
        foreach($infix_modules as $module){
            $module = $module->toArray();
            InfixModuleManager::create($module);
            if($module['purchase_code'] != null){
                if(!Schema::hasColumn('general_settings', 'general_settings')) {
                    $name = $module['name'];
                    Schema::table('general_settings', function ($table) use ($name) {
                        $table->integer($name)->default(1)->nullable();
                    });
                }
            }
        }
        foreach($modules as $module){
            $module = $module->toArray();
            Module::create($module);
        }
        GeneralSetting::first()->update($setting);

        if(file_exists(asset_path('uploads'))){
            $this->delete_directory(asset_path('uploads'));
        }
        $zip = new ZipArchive;
        $res = $zip->open(asset_path('demo_db/reset_uploads.zip'));
        if ($res === true) {
            $zip->extractTo(storage_path('app/tempResetFile'));
            $zip->close();
        } else {
            abort(500, 'Error! Could not open File');
        }


        $src = storage_path('app/tempResetFile');
        $dst = asset_path('uploads');

        $this->recurse_copy($src, $dst);

        if(file_exists(storage_path('app/tempResetFile'))){
            $this->delete_directory(storage_path('app/tempResetFile'));
        }

        Artisan::call('optimize:clear');
        return true;

    }

    public function import_demo_database($request){
        $user = DB::table('users')->where('id', 1)->first();
        $data = (array) $user;
        $data['lang_code'] = 'en';
        $data['currency_id'] = 2;
        $data['currency_code'] = "USD";
        $data['is_verified'] = 1;
        $setting = [
            'system_domain' => app('general_setting')->system_domain,
            'copyright_text' => app('general_setting')->copyright_text,
            'software_version' => app('general_setting')->software_version,
            'system_version' => app('general_setting')->system_version
        ];
        $modules = Module::all();
        $infix_modules = InfixModuleManager::all();


        if(file_exists(asset_path('uploads'))){
            $this->delete_directory(asset_path('uploads'));
        }

        $zip = new ZipArchive;
        $res = $zip->open(asset_path('demo_db/demo_uploads.zip'));
        if ($res === true) {
            $zip->extractTo(storage_path('app/tempDemoFile'));
            $zip->close();
        } else {
            abort(500, 'Error! Could not open File');
        }
        $src = storage_path('app/tempDemoFile');
        $dst = asset_path('uploads');
        $this->recurse_copy($src, $dst);

        if(file_exists(storage_path('app/tempDemoFile'))){
            $this->delete_directory(storage_path('app/tempDemoFile'));
        }

        set_time_limit(2700);

        DB::statement("SET foreign_key_checks=0");

        Artisan::call('db:wipe',array('--force' => true));
        if(app('theme')->folder_path == 'amazy'){
            $sql = asset_path('demo_db/amazy_demo.sql');
        }else{
            $sql = asset_path('demo_db/amazcart_demo.sql');
        }
        DB::unprepared(file_get_contents($sql));

        DB::statement("SET foreign_key_checks=1");
        
        DB::statement("SET AUTOCOMMIT=1");
        Artisan::call('migrate',array('--force' => true));
        

        User::where('id', 1)->update($data);
        InfixModuleManager::query()->truncate();
        Module::query()->truncate();
        foreach($infix_modules as $module){
            InfixModuleManager::create([
                'name' => $module->name,
                'email' => $module->email
            ]);
        }

        foreach($modules as $module){
            $module = $module->toArray();
            Module::create($module);
        }
        GeneralSetting::first()->update($setting);
        Artisan::call('optimize:clear');
        return true;

    }
}
