<?php

namespace App\Console\Commands;

use App\Setting;
use Illuminate\Console\Command;
use Illuminate\Support\Str;

class SettingGenerate extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'setting:generate {settingName} {--group=} {--tab=}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Setting generate command';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $basePath = base_path();
        $templatePath = $basePath . "/app/Console/Commands/Template/";
        $languages = ['en' => ['country' => 'English', 'label' => ''], 'ja' => ['country' => 'Japanese', 'label' => ''], 'vi' => ['country' => 'Vietnamese', 'label' => '']];

        $settingName = $this->argument('settingName');
        /*$settingName = str_replace(" ", "", $settingName);
        $settingName = str_replace("-", "", $settingName);
        $settingName = str_replace("_", "", $settingName);*/
        $group = $this->option('group');
        $tab = $this->option('tab');
        $slug = Str::slug($settingName, "_");

        if ($settingName == null || $settingName == "") {
            $this->error("Setting Name is not valid.");
            return false;
        }

        $checkExist = Setting::where('slug', $slug)->first();
        if (isset($checkExist) && $checkExist != null && $checkExist != "") {
            $this->error("Setting {$settingName} is exist.");
            return false;
        }

        if ($group == null || $group == "") {
            $group = $this->ask('Do you want to create a new group? (Default: general)');
            $group = ($group != null && $group != "") ? $group : 'general';
            $group = str_replace(" ", "_", $group);
            $group = strtolower($group);
            $this->info("Group: {$group}");
        }

        if ($tab == null || $tab == "") {
            $tab = $this->ask('Do you want to create a new tab? (Default: all)');
            $tab = ($tab != null && $tab != "") ? $tab : 'all';
            $tab = str_replace(" ", "_", $tab);
            $tab = strtolower($tab);
            $this->info("Tag: {$tab}");
        }
        $tab = Str::slug($tab, "_");

        $message = "========================================\r\n";
        $message .= "Setting Name: {$settingName}\r\n";
        $message .= "Group: {$group}\r\n";
        $message .= "Tab: {$tab}\r\n";

        $checkGroup = Setting::where('group', $group)->count();
        $groupPathName = str_replace("_", "", $group);
        $groupPathName = str_replace("-", "", $groupPathName);
        $groupPathName = str_replace(" ", "", $groupPathName);
        $groupPathName = strtolower(trim($groupPathName));
        $groupPathNameUpper = ucfirst($groupPathName);

        if ($checkGroup <= 0) {
            $routerSettingFile = $basePath . "/resources/js/router/modules/setting.js";
            $routerSettingTemplateFile = $templatePath . "SettingRouter.template";
            if (file_exists($routerSettingFile) && file_exists($routerSettingTemplateFile)) {
                $routerSettingTemplateContent = file_get_contents($routerSettingTemplateFile);
                $routerSettingTemplateContent = str_replace('{SettingSlug}', $groupPathName, $routerSettingTemplateContent);
                $routerSettingTemplateContent = str_replace('{SettingSlugUpper}', $groupPathNameUpper, $routerSettingTemplateContent);

                $routerSettingContent = file_get_contents($routerSettingFile);
                $routerSettingContent = str_replace('/*{SettingGenerate}*/', $routerSettingTemplateContent, $routerSettingContent);
                file_put_contents($routerSettingFile, $routerSettingContent);
            }

            $viewSettingFile = $basePath . "/resources/js/views/setting/{$groupPathNameUpper}.vue";
            $viewSettingTemplateFile = $templatePath . "SettingView.template";
            if (isset($viewSettingTemplateFile) && !file_exists($viewSettingFile)) {
                $viewSettingTemplateContent = file_get_contents($viewSettingTemplateFile);
                $viewSettingTemplateContent = str_replace('{SettingSlug}', $groupPathName, $viewSettingTemplateContent);
                $viewSettingTemplateContent = str_replace('{SettingSlugUpper}', $groupPathNameUpper, $viewSettingTemplateContent);
                file_put_contents($viewSettingFile, $viewSettingTemplateContent);
            }
        }

        foreach ($languages as $lKey => $language) {
            do {
                $label = $this->ask("Please type setting label for {$language['country']}? (Required*)");
                if ($label != null && $label != "") {
                    $languages[$lKey]['label'] = $label;
                    $message .= "Label {$language['country']}: {$label}\r\n";
                }
            } while ($label == null || $label == "");
        }

        $content = $this->ask("Please type default setting value of {$settingName}?");
        $example = $this->ask("Please type example setting?");
        do {
            $rule = $this->ask("Please type rule setting value [nullable|required]?(default: nullable)");
        } while ($rule != null && $rule != "" && $rule != "nullable" && $rule != "required");

        //Add Language
        foreach ($languages as $lKey => $langItem) {
            $langFile = $basePath . "/resources/js/lang/{$lKey}.js";
            if (file_exists($langFile)) {
                $langContent = file_get_contents($langFile);
                $newLanguageSetting = "{$group}_{$slug}: '{$langItem['label']}',\r\n\t\t\tsettingKeyGenerate: '',";
                $langContent = str_replace("settingKeyGenerate: '',", $newLanguageSetting, $langContent);
                if ($checkGroup <= 0) {
                    $langContent = str_replace('/*{importRouterLang}*/', "setting{$groupPathNameUpper}: '{$groupPathNameUpper}',\r\n\t\t/*{importRouterLang}*/", $langContent);
                }
                file_put_contents($langFile, $langContent);
            }
        }

        Setting::create([
            'group'        => $group,
            'tab'          => $tab,
            'slug'         => $slug,
            'name'         => $settingName,
            'content'      => $content,
            'example'      => $example,
            'rule'         => $rule,
            'is_activated' => 1,
            'is_deleted'   => 0,
            'created_at'   => date('Y-m-d H:i:s'),
            'updated_at'   => date('Y-m-d H:i:s')
        ]);

        //Update Store Config File
        $allSetting = Setting::all();
        $storeConfigFile = $basePath . "/resources/js/store/modules/config.js";
        $storeConfigTemplateFile = $templatePath . "StoreConfig.template";
        if (file_exists($storeConfigTemplateFile)) {
            $listSlugs = "";
            foreach ($allSetting as $it) {
                $listSlugs .= ($listSlugs == "") ? "{$it->slug}: ''," : "\r\n\t{$it->slug}: '',";
            }
            $storeConfigTemplateContent = file_get_contents($storeConfigTemplateFile);
            $storeConfigTemplateContent = str_replace('{ConfigSlugs}', $listSlugs, $storeConfigTemplateContent);
            file_put_contents($storeConfigFile, $storeConfigTemplateContent);
        }

        //Save Setting for other systems
        $settingDataFile = $basePath . "/app/Console/Commands/SettingData/settings.json";
        if (file_exists($settingDataFile)) {
            if ($allSetting->count() > 0) file_put_contents($settingDataFile, json_encode($allSetting->toArray()));
            $this->info("=> Note! Please run this command to apply settings for other systems: composer dump-autoload && php artisan setting:update");
        }

        $message .= "Default setting value: {$content}\r\n";
        $message .= "Example for setting: {$example}\r\n";
        $message .= "Rule of setting: {$rule}\r\n";
        $message .= "========================================\r\n";
        $this->info($message);


        $this->info("Done! Created setting {$settingName}");
    }
}
