/**
  * Efetua as configurações do modulo passado
  *
  * @param $moduleType
  * @param $moduleName
  * @param array $rollback
  * @return array|bool
  */
 public static function makeModuleConfigs($moduleType, $moduleName, array &$rollback)
 {
     $errors = [];
     //Pega configurações
     $configuracoes = Configs::getConfig(PathHelper::getModuleConfigPath($moduleType, $moduleName), Strings::CONFIG_CONFIGURATIONS);
     //Inicia o Rollback de arquivos configurados
     $rollback[Strings::ROLLBACK_MODULE_CONFIGS_TAG] = [];
     foreach ($configuracoes as $configuracao => $valor) {
         if ($valor != Strings::EMPTY_STRING) {
             $path = explode(Strings::MODULE_CONFIG_CONFIGS_SEPARATOR, $configuracao);
             array_pop($path);
             $path = PathHelper::getConfigDir(implode(Strings::PATH_SEPARATOR, $path) . Strings::PHP_EXTENSION);
             $configName = str_replace(Strings::MODULE_CONFIG_CONFIGS_SEPARATOR, Strings::MODULE_CONFIG_CONFIGS_SEPARATOR_REPLACEMENT, $configuracao);
             //Inicia o Rollback de arquivos configurados
             $rollback[Strings::ROLLBACK_MODULE_CONFIGS_TAG][EscapeHelper::encode($configName)] = [];
             //Adiciona para a lista de rollback
             $rollback[Strings::ROLLBACK_MODULE_CONFIGS_TAG][EscapeHelper::encode($configName)][EscapeHelper::encode($path)] = EscapeHelper::encode(file_get_contents($path));
             //Se ao tentar configurar temos um erro, então:
             if (Configs::setLaravelConfig($configuracao, $valor) == false) {
                 //Adiciona o erro para o array de erros
                 $errors[] = Strings::cantMakeModuleConfig($moduleType . Strings::MODULE_TYPE_NAME_SEPARATOR . $moduleName, $configuracao);
             }
         }
     }
     return !empty($errors) ? $errors : true;
 }
 /**
  * Execute the console command.
  *
  * @return mixed
  */
 public function handle()
 {
     //saved instace of this
     $that = $this;
     //Tipo do modulo
     $moduleType = $this->argument("type");
     //Nome do modulo
     $moduleName = $this->argument("name");
     //Inicializa variavel erros
     LoadModule::$errors = [];
     //Prepara variavel de rollback caso aja erro
     $rollback = [];
     //Verifica se foram passados os comandos inline
     if (is_null($moduleType) && is_null($moduleName)) {
         //pede o tipo do modulo
         $moduleType = $this->ask(Strings::MODULE_TYPE);
         //pede o nome do modulo
         $moduleName = $this->ask(Strings::moduleNameForThisType($moduleType));
     }
     //Modulos ja carregados
     $oldLoadedModules = Configs::getConfig(PathHelper::getModuleGeneralConfig(), Strings::CONFIG_LOADED_MODULES);
     //Inicializa variavel de array dos modulos carregados
     $explodedLoadedModules = null;
     //Inicializa variavel de array dos tipos de modulos carregados
     $explodedLoadedTypes = null;
     //Seta override de todos os arquivos para false
     $copyAll = false;
     //Pega modulos carredos em forma de array
     $explodedLoadedModules = ModulesHelper::getLoadedModules($oldLoadedModules);
     //Separa os tipos dos modulos carregados em um array
     $explodedLoadedTypes = ModulesHelper::explodeTypes($explodedLoadedModules);
     //Cria table de verificação das migrations
     LoadModule::$errors = ModulesHelper::createMigrationsCheckTable();
     /////////////////////////////////CHECA PELA EXISTENCIA DO MODULO////////////////////////////////////////////////
     ModulesHelper::executeHelperMethod(empty(LoadModule::$errors), function () use($moduleType, $moduleName) {
         return ModulesHelper::checkModuleExistence($moduleType, $moduleName);
     }, function ($result) {
         if ($result !== true) {
             LoadModule::$errors = array_merge(LoadModule::$errors, $result);
         }
     }, $this, Strings::checkModuleExistence($moduleType, $moduleName));
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //TODO: checar se o modulo ja esta carregado
     /////////////////////////////////CHECA POR CONFLITOS ENTRE OS MODULOS///////////////////////////////////////////
     ModulesHelper::executeHelperMethod(empty(LoadModule::$errors), function () use($moduleType, $moduleName, $explodedLoadedModules, $explodedLoadedTypes) {
         return ModulesHelper::checkModuleConflicts(Configs::getConfig(PathHelper::getModuleConfigPath($moduleType, $moduleName), Strings::MODULE_CONFIG_CONFLICT), $explodedLoadedModules, $explodedLoadedTypes);
     }, function ($result) {
         if ($result !== true) {
             LoadModule::$errors = array_merge(LoadModule::$errors, $result);
         }
     });
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////CHECA POR ERROS DE DEPENDENCIA ENTRE OS MODULOS///////////////////////////////////
     ModulesHelper::executeHelperMethod(empty(LoadModule::$errors), function () use($moduleType, $moduleName, $explodedLoadedModules, $explodedLoadedTypes) {
         return ModulesHelper::checkModuleDependencies(Configs::getConfig(PathHelper::getModuleConfigPath($moduleType, $moduleName), Strings::MODULE_CONFIG_DEPENDENCIES), $explodedLoadedModules, $explodedLoadedTypes);
     }, function ($result) {
         if ($result !== true) {
             LoadModule::$errors = array_merge(LoadModule::$errors, $result);
         }
     });
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     ////////////////////////////////////MARCA O MODULO COMO CARREGADO///////////////////////////////////////////////
     ModulesHelper::executeHelperMethod(empty(LoadModule::$errors), function () use($explodedLoadedModules, $moduleType, $moduleName, &$rollback) {
         return ModulesHelper::setModuleAsLoaded($explodedLoadedModules, $moduleType, $moduleName, $rollback);
     }, function ($result) {
         if ($result !== true) {
             LoadModule::$errors = array_merge(LoadModule::$errors, $result);
         }
     }, $this, Strings::STATUS_SETING_AS_LOADED);
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////APLICA AS CONFIGURAÇÕES REQUERIDAS PELO MODULO////////////////////////////////////
     ModulesHelper::executeHelperMethod(empty(LoadModule::$errors), function () use($moduleType, $moduleName, &$rollback) {
         return ModulesHelper::makeModuleConfigs($moduleType, $moduleName, $rollback);
     }, function ($result) {
         if ($result !== true) {
             LoadModule::$errors = array_merge(LoadModule::$errors, $result);
         }
     }, $this, Strings::STATUS_SETTING_MODULE_CONFIGS);
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////ORDINARY FILE COPY////////////////////////////////////////////////
     ModulesHelper::executeHelperMethod(empty(LoadModule::$errors), function () use($moduleType, $moduleName, $copyAll, &$rollback, $that) {
         return ModulesHelper::makeOrdinaryCopies($moduleType, $moduleName, $copyAll, $rollback, $that);
     }, function ($result) {
         if ($result !== true) {
             LoadModule::$errors = array_merge(LoadModule::$errors, $result);
         }
     }, $this, Strings::STATUS_COPYING_ORDINARY_FILES);
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     ////////////////////////////////////////////MIGRATION FILES COPY////////////////////////////////////////////////
     ModulesHelper::executeHelperMethod(empty(LoadModule::$errors), function () use($moduleType, $moduleName, $copyAll, &$rollback, $that) {
         return ModulesHelper::makeMigrationsCopies($moduleType, $moduleName, $copyAll, $rollback, $that);
     }, function ($result) {
         if ($result !== true) {
             LoadModule::$errors = array_merge(LoadModule::$errors, $result);
         }
     }, $this, Strings::STATUS_COPYING_MIGRATION_FILES);
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     ////////////////////////////////////////////////ROUTE_BUILDER///////////////////////////////////////////////////
     ModulesHelper::executeHelperMethod(empty(LoadModule::$errors), function () use($moduleType, $moduleName, &$rollback) {
         return ModulesHelper::buildRoutes($moduleType, $moduleName, $rollback);
     }, function ($result) {
         if ($result !== true) {
             LoadModule::$errors = array_merge(LoadModule::$errors, $result);
         }
     }, $this, Strings::STATUS_BUILDING_ROUTES);
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     ////////////////////////////////////////////////RUN MODULE MIGRATIONS///////////////////////////////////////////
     ModulesHelper::executeHelperMethod(empty(LoadModule::$errors), function () use($moduleType, $moduleName, &$rollback, $that) {
         return ModulesHelper::runMigrations($moduleType, $moduleName, $rollback, $that);
     }, function ($result) {
         if ($result !== true) {
             LoadModule::$errors = array_merge(LoadModule::$errors, $result);
         }
     }, $this, Strings::STATUS_RUNING_MIGRATIONS);
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     ////////////////////////////////////////////////GENERATE ROLLBACK FILE//////////////////////////////////////////
     ModulesHelper::executeHelperMethod(empty(LoadModule::$errors), function () use($moduleType, $moduleName, &$rollback) {
         return ModulesHelper::createRollbackFile($moduleType, $moduleName, $rollback);
     }, function ($result) {
         if ($result !== true) {
             LoadModule::$errors = array_merge(LoadModule::$errors, $result);
         }
     }, $this, Strings::STATUS_GEN_ROLLBACK);
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     ////////////////////////////////////////////////RESPONSE (OUTPUT)///////////////////////////////////////////////
     if (empty(LoadModule::$errors)) {
         //Se os comandos rodarem com sucesso
         //Comentario comando executado com sucesso
         $this->comment(Strings::successfullyRunModuleLoad($moduleType, $moduleName));
         return true;
     } else {
         //Se ocorrer erro ao rodar os comandos
         foreach (LoadModule::$errors as $error) {
             $this->error($error);
         }
         RollbackManager::execSoftRollback($rollback, $this);
         return false;
     }
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 }