<?php

namespace App\Console\Commands;

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

class SettingUpdate extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'setting:update';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Setting updating 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/";
        $settingDataFile = $basePath . "/app/Console/Commands/SettingData/settings.json";
        $countUpdated = 0;
        $countCreated = 0;
        if (file_exists($settingDataFile)) {
            $settings = file_get_contents($settingDataFile);
            if ($settings != null && $settings != "") {
                $settings = json_decode($settings, true);
                foreach ($settings as $setting) {
                    $settingItem = Setting::where('slug', $setting['slug'])->first();
                    if ($settingItem != null && $settingItem != "") {
                        if ($this->confirm("[{$setting['name']}] setting already exists, do you want to update it?")) {
                            $settingItem->group = $setting['group'];
                            $settingItem->tab = $setting['tab'];
                            $settingItem->name = $setting['name'];
                            $settingItem->content = $setting['content'];
                            $settingItem->example = $setting['example'];
                            $settingItem->rule = $setting['rule'];
                            $settingItem->save();
                            $countUpdated++;
                        }
                    } else {
                        Setting::create([
                            'group'        => $setting['group'],
                            'tab'          => $setting['tab'],
                            'slug'         => $setting['slug'],
                            'name'         => $setting['name'],
                            'content'      => $setting['content'],
                            'example'      => $setting['example'],
                            'rule'         => $setting['rule'],
                            'is_activated' => 1,
                            'is_deleted'   => 0,
                            'created_at'   => $setting['created_at'],
                            'updated_at'   => $setting['updated_at']
                        ]);
                        $countCreated++;
                    }
                }
            } else {
                $this->error("No setting data.");
            }

            //Update Store Config File
            $storeConfigFile = $basePath . "/resources/js/store/modules/config.js";
            $storeConfigTemplateFile = $templatePath . "StoreConfig.template";
            if (file_exists($storeConfigTemplateFile)) {
                $listSlugs = "";
                $allSetting = Setting::all();
                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);
            }
            $this->info("Done! Updated {$countUpdated} settings, created {$countCreated} settings.");
        }
    }
}
