# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: BUSL-1.1

require 'open-uri'
require 'digest'
require_relative "./errors"

module VagrantPlugins
  module Salt
    class BootstrapDownloader
      WINDOWS_URL = "https://winbootstrap.saltproject.io"
      URL = "https://bootstrap.saltproject.io"
      SHA256_SUFFIX = "sha256"

      def initialize(guest)
        @guest = guest
        @logger  = Log4r::Logger.new("vagrant::salt::bootstrap_downloader")
      end

      def source_url 
        @guest == :windows ? WINDOWS_URL : URL
      end

      def get_bootstrap_script
        @logger.debug "Downloading bootstrap script from #{source_url}"
        script_file = download(source_url)

        verify_sha256(script_file)

        @logger.info "Downloaded and verified salt-bootstrap script"
        script_file
      end

      def verify_sha256(script)
        @logger.debug "Downloading sha256 file from #{source_url}/#{SHA256_SUFFIX}"
        sha256_file = download("#{source_url}/#{SHA256_SUFFIX}")
        sha256 = extract_sha256(sha256_file.read)
        sha256_file.close

        @logger.debug "Computing sha256 value from script file"
        computed_sha256 = Digest::SHA256.hexdigest(script.read)
        script.rewind

        @logger.debug "Comparing sha256 values"
        if computed_sha256 != sha256
          @logger.debug "Mismatched sha256, expected #{sha256} but computed #{computed_sha256}"
          raise Salt::Errors::InvalidShasumError, source: source_url, expected_sha: sha256, computed_sha: computed_sha256
        end
        @logger.debug "Sha256 values match"
      end

      def extract_sha256(text)
        text.scan(/\b([a-f0-9]{64})\b/).last.first
      end

      def download(url)
        URI(url).open
      end
    end
  end
end
