# frozen_string_literal: true

require_relative '../config'
require_relative '../logging'

require 'aws-sdk-s3'
require 'chef'

module Utils
  # Provides methods for interacting with a Chef server
  class Chef
    include Logging

    S3_CLIENT = Aws::S3::Client.new(region: Config::AWS_REGION)

    def self.configure_cert(s3_bucket:, s3_key:)
      FileUtils.mkdir_p(Config::TRUSTED_CERTS_DIR)
      cert_file = "#{Config::TRUSTED_CERTS_DIR}/chef.crt"

      logger.info("Downloading Chef certificate from s3://#{s3_bucket}/#{s3_key} to #{cert_file}")
      S3_CLIENT.get_object(
        response_target: cert_file,
        bucket: s3_bucket,
        key: s3_key
      )
      ::Chef::Config[:trusted_certs_dir] = Config::TRUSTED_CERTS_DIR
    end

    def self.configure(chef_server_url:, chef_client_key:, cert_s3_bucket:, cert_s3_key:)
      configure_cert(s3_bucket: cert_s3_bucket, s3_key: cert_s3_key)

      ::Chef::Config[:node_name] = Config::CHEF_CLIENT_NAME
      ::Chef::Config[:chef_server_url] = chef_server_url
      ::Chef::Config[:client_key_contents] = chef_client_key

      logger.info("Using client #{::Chef::Config[:node_name]} with Chef server #{::Chef::Config[:chef_server_url]}")
    end

    def self.create_encrypted_data_bag(data:, secret:)
      encrypted_data = ::Chef::EncryptedDataBagItem.encrypt_data_bag_item(data, secret.strip)

      data_bag_item = ::Chef::DataBagItem.new
      data_bag_item.data_bag(Config::CHEF_DATA_BAG_NAME)
      data_bag_item.raw_data = encrypted_data

      logger.info("Storing data bag item with ID #{data_bag_item.id} in data bag #{data_bag_item.data_bag}")
      data_bag_item.save
      logger.info('Data bag item saved successfully')
    end
  end
end
