# frozen_string_literal: true

module Mina
  module DSL
    extend Forwardable
    def_delegators :configuration, :fetch, :set, :set?, :ensure!
    def_delegators :commands, :command, :comment

    def configuration
      Configuration.instance
    end

    def invoke(task, *args)
      Rake::Task[task].invoke(*args)
      Rake::Task[task].reenable
    end

    def commands
      @commands ||= Commands.new
    end

    def reset!
      @commands = Commands.new
    end

    def run(backend)
      error! "Can't use run block inside another run block. #{caller[2]}" if set?(:run_bock)
      set(:run_bock, true)
      invoke :"#{backend}_environment"
      yield
      commands.run(backend)
      @commands = Commands.new
      set(:run_bock, nil)
    end

    def on(stage)
      old_stage, commands.stage = commands.stage, stage
      yield
      commands.stage = old_stage
    end

    def in_path(path, indent: nil)
      real_commands = commands
      @commands = Commands.new
      yield
      real_commands.command(commands.process(path), quiet: true, indent: indent)
      @commands = real_commands
    end

    def deploy(&block)
      run :remote do
        set(:deploy_block, true)
        command deploy_script(&block), quiet: true
        set(:deploy_block, false)
      end
    end
  end
end
extend Mina::DSL
