module Fog
  module Compute
    class HPV2
      class Real
        # Create a new keypair
        #
        # ==== Parameters
        # * 'key_name'<~String> - Name of the keypair
        # * 'public_key'<~String> - The public key for the keypair
        #
        # ==== Returns
        # * response<~Excon::Response>:
        #   * body<~Hash>:
        #   * 'keypair'<~Hash> - The keypair data
        #     * 'public_key'<~String> - The public key for the keypair
        #     * 'private_key'<~String> - The private key for the keypair
        #     * 'user_id'<~String> - The user id
        #     * 'fingerprint'<~String> - SHA-1 digest of DER encoded private key
        #     * 'name'<~String> - Name of key
        def create_key_pair(key_name, public_key = nil)
          if public_key.nil?
            data = {
              'keypair' => {
                'name' => key_name
              }
            }
          else
            data = {
              'keypair' => {
                'name'       => key_name,
                'public_key' => public_key
              }
            }
          end

          request(
            :body     => Fog::JSON.encode(data),
            :expects  => 200,
            :method   => 'POST',
            :path     => 'os-keypairs'
          )
        end
      end

      class Mock
        def create_key_pair(key_name, public_key = nil)
          response = Excon::Response.new
          response.status = 200
          private_key, new_public_key = Fog::HP::Mock.key_material
          new_public_key = public_key if public_key  # if public key was passed in
          data = {
            'public_key'   => new_public_key,
            'fingerprint'  => Fog::HP::Mock.key_fingerprint,
            'name'         => key_name
          }
          self.data[:last_modified][:key_pairs][key_name] = Time.now
          self.data[:key_pairs][key_name] = { 'keypair' => data }
          if public_key
            response.body = { 'keypair' => data.merge({'user_id' => Fog::HP::Mock.user_id,}) }
          else
            response.body = { 'keypair' => data.merge({'private_key'  => private_key, 'user_id' => Fog::HP::Mock.user_id}) }
          end
          response
        end
      end
    end
  end
end
