# frozen_string_literal: true

# OVERIDE RAILS TASK Rake::TaskManager.class_eval do

def alias_task(fq_name)
  new_name = "#{fq_name}:original"
  @tasks[new_name] = @tasks.delete(fq_name)
end

end

def alias_task(fq_name)

Rake.application.alias_task(fq_name)

end

def override_task(*args, &block)

name, _params, _deps = Rake.application.resolve_args(args.dup)
fq_name = Rake.application.instance_variable_get(:@scope).to_a.reverse.push(name).join(':')
alias_task(fq_name)
Rake::Task.define_task(*args, &block)

end

namespace :db do

override_task create: :load_config do
  system('AS_DB_ADMIN=true rake db:create:original')
end

override_task drop: :load_config do
  system('AS_DB_ADMIN=true rake db:drop:original')
end

override_task migrate: :load_config do
  system('AS_DB_ADMIN=true rake db:migrate:original')
end

override_task rollback: :load_config do
  system('AS_DB_ADMIN=true rake db:rollback:original')
end

override_task prepare: :load_config do
  system('AS_DB_ADMIN=true rake db:prepare:original')
end

override_task setup: :load_config do
  system('AS_DB_ADMIN=true rake db:setup:original')
end

override_task prepare: :load_config do
  system('AS_DB_ADMIN=true rake db:reset:original')
end

override_task purge: :load_config do
  system('AS_DB_ADMIN=true rake db:purge:original')
end

override_task abort_if_pending_migrations: :load_config do
  system('AS_DB_ADMIN=true rake db:abort_if_pending_migrations:original')
end

override_task seed: :load_config do
  system('AS_DB_ADMIN=true rake db:seed:original')
end

namespace :test do
  override_task create: :load_config do
    system('AS_DB_ADMIN=true rake db:test:create:original')
  end

  override_task drop: :load_config do
    system('AS_DB_ADMIN=true rake db:test:drop:original')
  end

  override_task prepare: :load_config do
    system('AS_DB_ADMIN=true rake db:test:prepare:original')
  end

  override_task setup: :load_config do
    system('AS_DB_ADMIN=true rake db:test:setup:original')
  end

  override_task purge: :load_config do
    system('AS_DB_ADMIN=true rake db:test:purge:original')
  end

  override_task load_schema: :load_config do
    system('AS_DB_ADMIN=true rake db:test:load_schema:original')
  end
end

namespace :enviroment do
  override_task set: :load_config do
    system('AS_DB_ADMIN=true rake db:enviroment:set:original')
  end
end

namespace :schema do
  override_task load: :load_config do
    system('AS_DB_ADMIN=true rake db:schema:load:original')
    PgRls.admin_execute do
      PgRls.execute <<-SQL
        DROP ROLE IF EXISTS #{PgRls::SECURE_USERNAME};
        CREATE USER #{PgRls::SECURE_USERNAME} WITH PASSWORD '#{PgRls.database_configuration['password']}';
        GRANT ALL PRIVILEGES ON TABLE schema_migrations TO #{PgRls::SECURE_USERNAME};
        GRANT USAGE ON SCHEMA public TO #{PgRls::SECURE_USERNAME};
        ALTER DEFAULT PRIVILEGES IN SCHEMA public
          GRANT SELECT, INSERT, UPDATE, DELETE
          ON TABLES TO #{PgRls::SECURE_USERNAME};
        GRANT SELECT, INSERT, UPDATE, DELETE
          ON ALL TABLES IN SCHEMA public
          TO #{PgRls::SECURE_USERNAME};
        GRANT USAGE, SELECT
          ON ALL SEQUENCES IN SCHEMA public
          TO #{PgRls::SECURE_USERNAME};
      SQL
    end
  end
end

end