# @summary
#  install Docker Machine using the recommended curl command.
#
# @param ensure
#   Whether to install or remove Docker Machine
#   Valid values are absent present
#
# @param version
#   The version of Docker Machine to install.
#
# @param install_path
#   The path where to install Docker Machine.
#
# @param proxy
#   Proxy to use for downloading Docker Machine.
#
# @param url
#   The URL from which the docker machine binary should be fetched
#
# @param curl_ensure
#   Whether or not the curl package is ensured by this module.
#
class docker::machine (
  Enum[present,absent]                                 $ensure       = 'present',
  Optional[String]                                     $version      = $docker::params::machine_version,
  Optional[String]                                     $install_path = $docker::params::machine_install_path,
  Optional[Pattern['^((http[s]?)?:\/\/)?([^:^@]+:[^:^@]+@|)([\da-z\.-]+)\.([\da-z\.]{2,6})(:[\d])?([\/\w \.-]*)*\/?$']] $proxy = undef,
  Optional[Variant[Stdlib::HTTPUrl, Stdlib::HTTPSUrl]] $url          = undef,
  Optional[Boolean]                                    $curl_ensure  = $docker::params::curl_ensure,
) inherits docker::params {
  if $facts['os']['family'] == 'windows' {
    $file_extension = '.exe'
    $file_owner     = 'Administrator'
  } else {
    $file_extension = ''
    $file_owner     = 'root'
  }

  $docker_machine_location           = "${install_path}/docker-machine${file_extension}"
  $docker_machine_location_versioned = "${install_path}/docker-machine-${version}${file_extension}"

  if $ensure == 'present' {
    $docker_machine_url = $url ? {
      undef   => "https://github.com/docker/machine/releases/download/v${version}/docker-machine-${facts['kernel']}-x86_64${file_extension}",
      default => $url,
    }

    if $proxy != undef {
      $proxy_opt = "--proxy ${proxy}"
    } else {
      $proxy_opt = ''
    }

    if $facts['os']['family'] == 'windows' {
      $docker_download_command = "if (Invoke-WebRequest ${docker_machine_url} ${proxy_opt} -UseBasicParsing -OutFile \"${docker_machine_location_versioned}\") { exit 0 } else { exit 1}" # lint:ignore:140chars

      $parameters = {
        'proxy'                             => $proxy,
        'docker_machine_url'                => $docker_machine_url,
        'docker_machine_location_versioned' => $docker_machine_location_versioned,
      }

      exec { "Install Docker Machine ${version}":
        command  => epp('docker/windows/download_docker_machine.ps1.epp', $parameters),
        provider => powershell,
        creates  => $docker_machine_location_versioned,
      }

      file { $docker_machine_location:
        ensure  => 'link',
        target  => $docker_machine_location_versioned,
        require => Exec["Install Docker Machine ${version}"],
      }
    } else {
      if $curl_ensure {
        stdlib::ensure_packages(['curl'])
      }

      exec { "Install Docker Machine ${version}":
        path    => '/usr/bin/',
        cwd     => '/tmp',
        command => "curl -s -S -L ${proxy_opt} ${docker_machine_url} -o ${docker_machine_location_versioned}",
        creates => $docker_machine_location_versioned,
        require => Package['curl'],
      }

      file { $docker_machine_location_versioned:
        owner   => $file_owner,
        mode    => '0755',
        require => Exec["Install Docker Machine ${version}"],
      }

      file { $docker_machine_location:
        ensure  => 'link',
        target  => $docker_machine_location_versioned,
        require => File[$docker_machine_location_versioned],
      }
    }
  } else {
    file { $docker_machine_location_versioned:
      ensure => absent,
    }

    file { $docker_machine_location:
      ensure => absent,
    }
  }
}
