require 'fog/azurerm'
require 'yaml'

########################################################################################################################
######################                   Services object required by all actions                  ######################
######################                              Keep it Uncommented!                          ######################
########################################################################################################################

azure_credentials = YAML.load_file('credentials/azure.yml')

resources = Fog::Resources::AzureRM.new(
  tenant_id: azure_credentials['tenant_id'],
  client_id: azure_credentials['client_id'],
  client_secret: azure_credentials['client_secret'],
  subscription_id: azure_credentials['subscription_id']
)

network = Fog::Network::AzureRM.new(
  tenant_id: azure_credentials['tenant_id'],
  client_id: azure_credentials['client_id'],
  client_secret: azure_credentials['client_secret'],
  subscription_id: azure_credentials['subscription_id']
)

########################################################################################################################
######################                                 Prerequisites                              ######################
########################################################################################################################

begin
  resource_group = resources.resource_groups.create(
    name: 'TestRG-ER',
    location: LOCATION
  )
  Fog::Logger.debug 'Resource Group created!'

  ########################################################################################################################
  ######################                  Check Express Route Circuit Exists?                       ######################
  ########################################################################################################################

  flag = network.express_route_circuits.check_express_route_circuit_exists('TestRG-ER', 'testERCircuit')
  puts "Express Route Circuit doesn't exist." unless flag

  ########################################################################################################################
  ################                               Create Express Route Circuit                            #################
  ########################################################################################################################

  express_route_circuit = network.express_route_circuits.create(
    name: 'testERCircuit',
    location: LOCATION,
    tags: {
      key1: 'value1',
      key2: 'value2'
    },
    resource_group: 'TestRG-ER',
    sku_name: 'Standard_MeteredData',
    sku_tier: 'Standard',
    sku_family: 'MeteredData',
    service_provider_name: 'Telenor',
    peering_location: 'London',
    bandwidth_in_mbps: 100,
    peerings: [
      {
        name: 'AzurePublicPeering',
        peering_type: 'AzurePublicPeering',
        peer_asn: 100,
        primary_peer_address_prefix: '192.168.1.0/30',
        secondary_peer_address_prefix: '192.168.2.0/30',
        vlan_id: 200
      }
    ]
  )
  puts "Created express route circuit: #{express_route_circuit.name}"

  ########################################################################################################################
  ######################                           List Express Route Circuit                         ####################
  ########################################################################################################################

  circuits = network.express_route_circuits(resource_group: 'TestRG-ER')
  puts 'List express route circuits:'
  circuits.each do |circuit|
    puts circuit.name
  end

  ########################################################################################################################
  ######################             Check Express Route Circuit Authorization Exists?              ######################
  ########################################################################################################################

  flag = network.express_route_circuit_authorizations.check_express_route_cir_auth_exists('TestRG-ER', 'testERCircuit', 'Test-Auth')
  puts "Express Route Circuit Authorization doesn't exist." unless flag

  ########################################################################################################################
  ######################                Create Express Route Circuit Authorizations                   ####################
  ########################################################################################################################
  express_route_circuit_authorization = network.express_route_circuit_authorizations.create(
    resource_group: 'TestRG-ER',
    circuit_name: 'testERCircuit',
    authorization_use_status: 'Available',
    authorization_name: 'Test-Auth',
    name: 'Unique-Auth-Name'
  )
  puts "Created express route circuit authorization: #{express_route_circuit_authorization.name}"

  ########################################################################################################################
  ######################                Get a Express Route Circuit Authorization                     ####################
  ########################################################################################################################
  authorization = network.express_route_circuit_authorizations.get('TestRG-ER', 'testERCircuit', 'Test-Auth')
  puts "Get express route circuit authorization: #{authorization.name}"

  ########################################################################################################################
  ######################                List Express Route Circuit Authorizations                     ####################
  ########################################################################################################################
  authorizations = network.express_route_circuit_authorizations(resource_group: 'TestRG-ER', circuit_name: 'testERCircuit')
  puts 'List express route circuit authorizations:'
  authorizations.each do |auth|
    puts auth.name
  end

  ########################################################################################################################
  ######################                Destroy Express Route Circuit Authorization                   ####################
  ########################################################################################################################
  authorization = network.express_route_circuit_authorizations.get('TestRG-ER', 'testERCircuit', 'Test-Auth')
  puts "Deleted express route circuit authorization: #{authorization.destroy}"

  ########################################################################################################################
  ######################                   Destroy Express Route Circuit                            ######################
  ########################################################################################################################
  circuit = network.express_route_circuits.get('TestRG-ER', 'testERCircuit')
  puts "Deleted express route circuit: #{circuit.destroy}"

  ########################################################################################################################
  ######################                         CleanUp                                            ######################
  ########################################################################################################################
  resource_group = resources.resource_groups.get('TestRG-ER')
  resource_group.destroy
  puts 'Integration Test for express route circuit ran successfully'
rescue
  puts 'Integration Test for express route circuit is failing'
  resource_group.destroy unless resource_group.nil?
end