<?php

namespace App\Console\Commands;

use App\Module;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;

class ModuleDelete extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'module:delete {moduleName} {--table=}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Module Delete description';

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

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $basePath = base_path();
        $moduleName = $this->argument('moduleName');
        $moduleNameLower = strtolower($moduleName);
        $moduleName = ucfirst($moduleNameLower);
        $table = $this->option('table');
        $table = strtolower($table);

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

        $module = Module::where('name', $moduleName)->first();
        if (!isset($module) || $module == null || $module == "") {
            $this->error("Module is not exist.");
            return false;
        }

        $deleteFiles = [];
        $modelFile = $basePath . "/app/{$moduleName}.php";
        $routerFile = $basePath . "/resources/js/router/modules/{$moduleNameLower}.js";
        $apiFile = $basePath . "/resources/js/api/{$moduleNameLower}.js";
        $listFile = $basePath . "/resources/js/views/{$moduleNameLower}/List.vue";
        $createFile = $basePath . "/resources/js/views/{$moduleNameLower}/Create.vue";
        $editFile = $basePath . "/resources/js/views/{$moduleNameLower}/Edit.vue";
        $detailFile = $basePath . "/resources/js/views/{$moduleNameLower}/components/{$moduleName}Detail.vue";
        $controllerFile = $basePath . "/app/Http/Controllers/Admin/{$moduleName}Controller.php";
        $resourceFile = $basePath . "/app/Http/Resources/Admin/{$moduleName}Resource.php";

        if (file_exists($modelFile)) $deleteFiles[] = $modelFile;
        if (file_exists($routerFile)) $deleteFiles[] = $routerFile;
        if (file_exists($apiFile)) $deleteFiles[] = $apiFile;
        if (file_exists($listFile)) $deleteFiles[] = $listFile;
        if (file_exists($createFile)) $deleteFiles[] = $createFile;
        if (file_exists($editFile)) $deleteFiles[] = $editFile;
        if (file_exists($detailFile)) $deleteFiles[] = $detailFile;
        if (file_exists($controllerFile)) $deleteFiles[] = $controllerFile;
        if (file_exists($resourceFile)) $deleteFiles[] = $resourceFile;

        $checkMigrateFile = "";
        if ($table != null && $table != "") {
            foreach(glob($basePath . '/database/migrations/*.php') as $migrateFile) {
                if (strpos($migrateFile, "create_{$table}_table.php") !== false) {
                    $checkMigrateFile = $migrateFile;
                    break;
                }
            }
        }
        if ($checkMigrateFile != "") $deleteFiles[] = $checkMigrateFile;

        if (count($deleteFiles) > 0) {
            $messageFiles = "The following files will be deleted: \r\n";
            $messageFiles .= "========================================================\r\n";
            foreach ($deleteFiles as $key => $item) {
                $pathFile = str_replace($basePath . "/", "", $item);
                $messageFiles .= ($key + 1) . ". " . $pathFile . " \r\n";
            }
            $messageFiles .= "========================================================\r\n";
            $this->info($messageFiles);
            if ($this->confirm('Are you sure delete all?')) {
                Module::where('name', $moduleName)->delete();
                foreach ($deleteFiles as $dIt) {
                    unlink($dIt);
                }
                if ($checkMigrateFile != "") {
                    Schema::dropIfExists($table);
                    shell_exec("composer dump-autoload");
                    DB::table('migrations')->where('migration', basename($checkMigrateFile))->delete();
                }
                $routerIndexFile = $basePath . "/resources/js/router/index.js";
                if (file_exists($routerIndexFile)) {
                    $routerIndexContent = file_get_contents($routerIndexFile);
                    $routerIndexContent = str_replace("import {$moduleNameLower}Routes from './modules/{$moduleNameLower}';\r\n", "", $routerIndexContent);
                    $routerIndexContent = str_replace("import {$moduleNameLower}Routes from './modules/{$moduleNameLower}';", "", $routerIndexContent);
                    $routerIndexContent = str_replace("{$moduleNameLower}Routes,\r\n", "", $routerIndexContent);
                    $routerIndexContent = str_replace("{$moduleNameLower}Routes,", "", $routerIndexContent);
                    file_put_contents($routerIndexFile, $routerIndexContent);
                }
                $manuallyMessage = "Please delete manually content of files: \r\n";
                $manuallyMessage .= "========================================================\r\n";
                $manuallyMessage .= "1. app/Laravue/Acl.php \r\n";
                $manuallyMessage .= "2. resources/js/lang/en.js \r\n";
                $manuallyMessage .= "3. resources/js/lang/ja.js \r\n";
                $manuallyMessage .= "4. resources/js/lang/vi.js \r\n";
                $manuallyMessage .= "5. routes/api.php \r\n";
                //$manuallyMessage .= "6. resources/js/router/index.js \r\n";
                $manuallyMessage .= "========================================================";

                $this->info($manuallyMessage);
                shell_exec("php artisan db:seed --class=ReloadPermission && composer dump-autoload");
                $this->info("Done! Deleted {$moduleName} Module.");
            } else {
                $this->info("Canceled! NOT Deleted {$moduleName} Module.");
            }
        } else {
            $this->error("Module is not exist.");
        }
    }
}
