# frozen_string_literal: true

require_relative 'base'
require_relative '../options/global'

module RubyTerraform
  module Commands
    # Wraps the +terraform state replace-provider+ command which replaces
    # provider for resources in the Terraform state.
    #
    # For options accepted on construction, see {#initialize}.
    #
    # When executing an instance of {StateReplaceProvider} via {#execute}, the
    # following options are supported:
    #
    # * +:from+: the fully qualified name of the provider to be replaced;
    #   required.
    # * +:to+: the fully qualified name of the provider to replace with;
    #   required.
    # * +:chdir+: the path of a working directory to switch to before executing
    #   the given subcommand.
    # * +:auto_approve+: if +true+, skips interactive approval; defaults to
    #   +false+.
    # * +:backup+: the path where Terraform should write the backup for the
    # 	state file; this can't be disabled; if not set, Terraform will write it
    # 	to the same path as the state file with a ".backup" extension.
    # * +:lock+: when +true+, locks the state file when locking is supported;
    #   when +false+, does not lock the state file; defaults to +true+.
    # * +:lock_timeout+: the duration to retry a state lock; defaults to +"0s"+.
    # * +:state+: the path to the state file to update; defaults to the current
    #   workspace state.
    # * +:ignore_remote_version+: whether or not to continue even if remote and
    #   local Terraform versions are incompatible; this may result in an
    #   unusable workspace, and should be used with extreme caution; defaults to
    #   +false+.
    #
    # @example Basic Invocation
    #   RubyTerraform::Commands::StateReplaceProvider.new.execute(
    #     from: 'hashicorp/aws',
    #     to: 'registry.acme.corp/acme/aws')
    #
    class StateReplaceProvider < Base
      include RubyTerraform::Options::Global

      # @!visibility private
      def subcommands
        %w[state replace-provider]
      end

      # @!visibility private
      def options
        %w[
          -auto-approve
          -backup
          -lock
          -lock-timeout
          -state
          -ignore-remote-version
        ] + super
      end

      # @!visibility private
      def arguments(parameters)
        [parameters[:from], parameters[:to]]
      end
    end
  end
end
