require_relative "./create_migration"
require_relative "./model"
require_relative "./rspec_model"
require_relative "../cli_exception"

module SOULs
  class DB < Thor
    desc "migrate", "Migrate Database"
    method_option :env, aliases: "--e", default: "development", desc: "Difine APP Enviroment - development | production"
    def migrate
      case options[:env]
      when "production"
        db_system("rake db:migrate RACK_ENV=production")
      else
        db_system("rake db:migrate")
        db_system("rake db:migrate RACK_ENV=test")
      end
      true
    end

    desc "create", "Create Database"
    method_option :env, aliases: "--e", default: "development", desc: "Difine APP Enviroment - development | production"
    def create
      case options[:env]
      when "production"
        db_system("rake db:create RACK_ENV=production")
      else
        db_system("rake db:create")
      end
    end

    desc "seed", "Insert Seed Data"
    method_option :env, aliases: "--e", default: "development", desc: "Difine APP Enviroment - development | production"
    def seed
      case options[:env]
      when "production"
        db_system("rake db:seed RACK_ENV=production")
      else
        db_system("rake db:seed")
        db_system("rake db:seed RACK_ENV=test")
      end
    end

    desc "migrate_reset", "Reset Database"
    method_option :env, aliases: "--e", default: "development", desc: "Difine APP Enviroment - development | production"
    def migrate_reset
      case options[:env]
      when "production"
        db_system("rake db:migrate:reset RACK_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1")
      else
        db_system("rake db:migrate:reset")
        db_system("rake db:migrate RACK_ENV=test")
      end
    end

    desc "reset", "Reset Database and Seed"
    method_option :env, aliases: "--e", default: "development", desc: "Difine APP Enviroment - development | production"
    def reset
      case options[:env]
      when "production"
        db_system("rake db:migrate:reset RACK_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1")
        db_system("rake db:seed RACK_ENV=production")
      else
        db_system("rake db:migrate:reset")
        db_system("rake db:migrate RACK_ENV=test")
        db_system("rake db:seed")
      end
    end

    desc "add_column [CLASS_NAME]", "Create ActiveRecord Migration File"
    def add_column(class_name)
      pluralized_class_name = class_name.underscore.pluralize
      system("rake db:create_migration NAME=add_column_to_#{pluralized_class_name}")
    end

    desc "rename_column [CLASS_NAME]", "Create ActiveRecord Migration File"
    def rename_column(class_name)
      pluralized_class_name = class_name.underscore.pluralize
      system("rake db:create_migration NAME=rename_column_to_#{pluralized_class_name}")
    end

    desc "change_column [CLASS_NAME]", "Create ActiveRecord Migration File"
    def change_column(class_name)
      pluralized_class_name = class_name.underscore.pluralize
      system("rake db:create_migration NAME=change_column_to_#{pluralized_class_name}")
    end

    desc "remove_column [CLASS_NAME]", "Create ActiveRecord Migration File"
    def remove_column(class_name)
      pluralized_class_name = class_name.underscore.pluralize
      system("rake db:create_migration NAME=remove_column_to_#{pluralized_class_name}")
    end

    desc "drop_table [CLASS_NAME]", "Create ActiveRecord Migration File"
    def drop_table(class_name)
      pluralized_class_name = class_name.underscore.pluralize
      system("rake db:create_migration NAME=drop_table_to_#{pluralized_class_name}")
    end

    private

    def db_system(cmd)
      system(cmd) or SOULs::Painter.error("DB is not running. Please run `souls docker psql`")
    end
  end
end
