#
# WARNING
#
# THIS CODE HAS BEEN MOVED TO CORE CHEF.  DO NOT SUMBIT PULL REQUESTS AGAINST THIS
# CODE.  IT WILL BE REMOVED IN THE FUTURE.
#

unless defined? Chef::Mixin::PowershellOut
  class Chef
    module Mixin
      module PowershellOut
        include Chef::Mixin::ShellOut

        begin
          include Chef::Mixin::WindowsArchitectureHelper
        rescue
          # nothing to do, as the include will happen when windows_architecture_helper.rb
          # is loaded.  This is for ease of removal of that library when either
          # powershell_out is core chef or powershell cookbook depends upon version
          # of chef that has Chef::Mixin::WindowsArchitectureHelper in core chef
        end

        def powershell_out(*command_args)
          Chef::Log.warn 'The powershell_out library in the windows cookbook is deprecated.'
          Chef::Log.warn 'Please upgrade to Chef 12.4.0 or later where it is built-in to core chef.'
          script = command_args.first
          options = command_args.last.is_a?(Hash) ? command_args.last : nil

          run_command(script, options)
        end

        def powershell_out!(*command_args)
          cmd = powershell_out(*command_args)
          cmd.error!
          cmd
        end

        private

        def run_command(script, options)
          if options && options[:architecture]
            architecture = options[:architecture]
            options.delete(:architecture)
          else
            architecture = node_windows_architecture(node)
          end

          disable_redirection = wow64_architecture_override_required?(node, architecture)

          if disable_redirection
            original_redirection_state = disable_wow64_file_redirection(node)
          end

          command = build_command(script)

          cmd = if options
                  shell_out(command, options)
                else
                  shell_out(command)
                end

          if disable_redirection
            restore_wow64_file_redirection(node, original_redirection_state)
          end

          cmd
        end

        def build_command(script)
          flags = [
            # Hides the copyright banner at startup.
            '-NoLogo',
            # Does not present an interactive prompt to the user.
            '-NonInteractive',
            # Does not load the Windows PowerShell profile.
            '-NoProfile',
            # always set the ExecutionPolicy flag
            # see http://technet.microsoft.com/en-us/library/ee176961.aspx
            '-ExecutionPolicy RemoteSigned',
            # Powershell will hang if STDIN is redirected
            # http://connect.microsoft.com/PowerShell/feedback/details/572313/powershell-exe-can-hang-if-stdin-is-redirected
            '-InputFormat None'
          ]

          command = "powershell.exe #{flags.join(' ')} -Command \"#{script}\""
          command
        end
      end
    end
  end
end
