class Meraki::Wireless::ConfigurationService < Meraki::BaseApi

  def initialize ln
    @ln = ln
    @meraki_config = get_integration_details @ln
    @vendor_org_id = @meraki_config.org_id
    @api_key = @meraki_config.api_key
  end

  #radio Profiles creation
  def create_radio_profile radio_object
    params = Meraki::Wireless::ObjectMapper.get_radio_profile_params radio_object
    response =  self.create_radio  @ln.vendor_network_id, params
    if response.first.present?
      radio_object.vendor_network_id = response.first['id'].to_s
      radio_object.save
      Rails.logger.info "[MERAKI][radio] :: Radio Profile Created successfully in meraki ::#{response.first}"
    else
      Rails.logger.info "[MERAKI][radio] :: Radio Profile Create error in Meraki #{response.second.to_s}"
    end
  end

  def create_radio network_id, radio_hsh
    begin
      Rails.logger.info "[MERAKI][radio] :: inside create RADIO:: VALues ::#{radio_hsh}"
      err = nil, response = nil
      response = MerakiApi.make_api_call(@api_key, "networks/#{network_id}/wireless/rfProfiles", 'POST', radio_hsh)
      Rails.logger.info "[MERAKI][radio] :: Radio Profile Created ..!!#{response.first}"
    rescue Exception => e
      err = e
    end
    [response, {msg: "err", :data => err }]
  end

  def update_radio_profile radio_object
    params = Meraki::Wireless::ObjectMapper.get_radio_profile_params radio_object
    number = radio_object.vendor_network_id
    response =  self.update_radio  @ln.vendor_network_id, params, number
    if response.first.present?
      Rails.logger.info "[MERAKI][radio] :: Radio Profile updated successfully in meraki ::#{response.first}"
    else
      Rails.logger.info "[MERAKI][radio] :: Radio Update error in Meraki #{response.second.to_s}"
    end
  end

  def update_radio network_id, hsh, number
    begin
      Rails.logger.info "[MERAKI][radio] :: inside update SSID:: VALues ::#{hsh}"
      err = nil, response = nil
      response = MerakiApi.make_api_call(@api_key, "networks/#{network_id}/wireless/rfProfiles/#{number}", 'PUT', hsh)
      Rails.logger.info "[MERAKI][radio] :: Radio updated ..!!#{response}"
    rescue Exception => e
      err = e
    end
    [response, {msg: "err", :data => err }]
  end

  def delete_radio_profile radio_object
    rf_id = radio_object.vendor_network_id
    response = MerakiApi.make_api_call @api_key, "networks/#{@ln.vendor_network_id}/wireless/rfProfiles/#{rf_id}", 'DELETE', {}
    Rails.logger.info "[MERAKI][#{@ln.vendor_network_id}][delete] :: #{response}"
    response
  end

  def update_device_radio_profile router_inventory
    serial_number = router_inventory.router_serial_number
    rp = router_inventory.radio_profile
    if rp.present?
      rs = rp.radio_settings
      params = {  rfProfileId: rp.vendor_network_id,
                  twoFourGhzSettings: {
                      channel: rs[0][:band],
                      targetPower: rs[0][:power]
                    },
                  fiveGhzSettings: {
                      channel: rs[1][:band],
                      channelWidth: rs[1][:bandwidth],
                      targetPower: rs[1][:power]
                }
              }
      response = MerakiApi.make_api_call(@api_key, "devices/#{serial_number}/wireless/radio/settings", 'PUT', params)
    end
    response
  end

  def get_radio_profiles
    puts "nw_id:: #{@ln.vendor_network_id}"
    response = []
    begin
      response = MerakiApi.make_api_call @api_key, "networks/#{@ln.vendor_network_id}/wireless/rfProfiles", 'GET', {}
    rescue Exception => e
      raise "[ERROR][MERAKI][get_network_ssids][#{@ln.vendor_network_id}] ERROR:: #{e}"
    end
    response
  end

  def sync_meraki_radios radio_objects
    radio_objects.each do |rf|
      radio_profile = @ln.radio_profiles.all.select {|rp| (rp.vendor_details || {})['number'] == rf['number']}.first
        hsh = {}
        h1 = {}
        h2 = {}
        h3 = {}
        hsh[:name] = rf["name"]
        hsh[:location_network_id] = @ln.id
        hsh[:vendor_details] = rf
        h1[:client_steering] = rf["clientBalancingEnabled"]
        h1[:assoc_steering] = rf["apBandSettings"]["bandSteeringEnabled"]
        h2[:band] = "2.4"
        h2[:power] = rf["fiveGhzSettings"]["maxPower"]
        h2[:bandwidth] = rf["fiveGhzSettings"]["channelWidth"]
        h3[:band] = "5"
        h3[:power] = rf["fiveGhzSettings"]["maxPower"]
        h3[:bandwidth] = rf["fiveGhzSettings"]["channelWidth"]
        if radio_profile.present?
          radio_profile.update_attributes(hsh)
        else
          r = RadioProfile.create(hsh)
          r.build_radio_management(h1).save
          r.radio_settings.create(h2).save
          r.radio_settings.create(h3).save
        end
    end
  end

  def get_network_ssids
    puts "nw_id:: #{@ln.vendor_network_id}"
    response = []
    begin
      response = MerakiApi.make_api_call @api_key, "networks/#{@ln.vendor_network_id}/wireless/ssids", 'GET', {}
    rescue Exception => e
      raise "[ERROR][MERAKI][get_network_ssids][#{@ln.vendor_network_id}] ERROR:: #{e}"
    end

    response
  end

  def sync_meraki_ssids ssids
    nw_ssids = ssids
    nw_ssids.each do |ssid_hsh|
      puts "SSID #{ssid_hsh}"
      nw_ssid = @ln.network_ssids.all.select {|nw| (nw.vendor_details || {})['number'] == ssid_hsh['number']}.first
      
      if nw_ssid.present?
        hsh = nw_ssid
      else
        hsh = {}
        hsh = {
          ssid_mode: "0", 
          is_isolate: false, 
          security_mode: "none", 
          wpa_algorithm: "tkip", 
          key_renewal_interval: "86400", 
          wpa_key: "12345678",
          ip_address: "192.168.222.1",
          captive_portal: "0", 
          wallgarden: "0", 
          dhcp_range_start: "192.168.222.2",
          dhcp_range_end: "192.168.222.254",
          dhcp_relay_server: 0,
          dhcp_lease_time: "86400", 
          subnet_mask: "255.255.255.0", 
          enable_ssid_qos: false, 
          uplink_priority: "1", 
          default_interim_time: "300", 
          default_idle_timeout: "1800",
          acl_mac: "0", 
          wna: "1"
        }
        hsh[:associated_aps_and_tags] = ["network:#{@ln.id}"]
      end

      if ssid_hsh['authMode'] == "psk"
        hsh[:security_mode] = "psk2"
      elsif ssid_hsh["authMode"] == "8021x-radius"
        hsh[:security_mode] = "wpa2"
      end
      hsh[:ssid_name] = ssid_hsh["name"]
      hsh[:is_enabled] = ssid_hsh["enabled"]
      hsh[:is_hidden] = !ssid_hsh["visible"] #((ssid_hsh["visible"] == true) ? false : true)
      if(ssid_hsh["ipAssignmentMode"] == "NAT mode")
        hsh[:nat] = "1"
        hsh[:is_isolate] = true
        hsh[:ssid_mode] = "1"
      elsif ssid_hsh["ipAssignmentMode"] == "Bridge mode"
        hsh[:ssid_mode] = "0"
      end
      if ssid_hsh["bandSelection"] == "5 GHz band only"
        hsh[:radio_band] = "5"
      elsif ssid_hsh["bandSelection"] == "Dual band operation"
        hsh[:radio_band] = "both"
      end
      hsh[:wallgarden] = ssid_hsh['walledGardenEnabled'] == true ? "1" : "0"
      hsh[:walled_garden_range] = ssid_hsh["walledGardenRanges"]
      hsh[:vendor_details] = ssid_hsh
      nw_ssid.present? ? hsh.save : @ln.network_ssids.build(hsh).save

      Rails.logger.info "[MERAKI][ssid] :: #{ssid_hsh["name"]} created in pcc "
    end
  end

  def update_network_ssid ssid_obj
    params = Meraki::Wireless::ObjectMapper.get_ssid_params ssid_obj
    number = ssid_obj.vendor_details["number"]
    response =  self.update_ssid  @ln.vendor_network_id, @vendor_org_id, params, number
    if response.first.present?
      #ssid_obj.update_column :vendor_details, response.first
      Rails.logger.info "[MERAKI][ssid] :: NetworkSsid updated successfully in meraki ::#{response.first}"
    else
      Rails.logger.info "[MERAKI][ssid] :: Update error in Meraki #{response.second.to_s}"
    end
  end

  def update_ssid network_id, organ_id, hsh, ssid_number
    begin
      Rails.logger.info "[MERAKI][ssid] :: inside update SSID:: VALues ::#{hsh}"
      err = nil, response = nil
      response = MerakiApi.make_api_call(@api_key, "networks/#{network_id}/wireless/ssids/#{ssid_number}", 'PUT', hsh)
      Rails.logger.info "[MERAKI][ssid] :: Ssid updated ..!!#{val}"
    rescue Exception => e
      err = e
    end
    [response, {msg: "err", :data => err }]
  end
end
