class Ruckus::ObjectMapper < Ruckus::BaseApi
  MSECURITY = {"psk2"=> "WPA2", "none" => "None"}
  W80211 = {"required"=>"required","disabled"=>"disabled","enabled"=>"capable"}
  POWERTX = {"0"=> "Full", "1"=>"-1dB", "2"=> "-2dB", "3"=>"-3dB(1/2)", "4"=>"-4dB", "5"=>"-5dB", "6"=>"-6dB(1/4)", "7"=>"-7dB", "8"=>"-8dB", "9"=>"-9dB(1/8)", "10"=>"-10dB", "30"=>"Full" }
  BANDBALANCING = {false=>"Disabled",true=>"UseZoneSetting"}

  def get_multiple_aps ln, device_serials
    hsh = {}
    loc_vendor_id = ln.try(:vendor_network_id)   
    #inventories = ln.router_inventories.pluck(:mac_id)
    if loc_vendor_id.present?
      hsh = { :targetZoneId => loc_vendor_id, :apMacs => device_serials }
    else
      hsh = { :targetZoneId => "default", :apMacs => device_serials }
    end
    hsh
  end

  def self.get_domain_params domainname
    return { "name"=> domainname}
  end

  def self.get_zone_params(ln, domainid="")
    hsh = {"name"=>ln.network_name, "countryCode"=>"US","timezone"=>{"systemTimezone"=>ActiveSupport::TimeZone.new(ln.timezone || 'UTC').tzinfo.name},"login"=> {"apLoginName"=> "admin","apLoginPassword"=> "P@55w0rd"}}
    domainid = ln.vendor_details[:domainid] || ln.integration_type.details['domainid'] if domainid.blank?
    hsh["domainId"] = domainid unless domainid.blank?
    p hsh
    hsh
  end

  def self.get_updated_zone_params ln
    Rails.logger.info ln.changes
    network_changes = ln.changes
    arr = ["network_name", "timezone"]
    hsh = {}
    if (network_changes.keys & arr).present?
      hsh["name"] = network_changes["network_name"].second unless network_changes["network_name"].blank?
      hsh["timezone"]["systemTimezone"] = ActiveSupport::TimeZone.new(network_changes["timezone"].second || 'UTC').tzinfo.name unless network_changes["timezone"].blank?
    end
    hsh
  end

  def self.get_firmware_upgrade_params upgrade_obj
    zone_list = []
    zones = upgrade_obj.organisation.location_networks
    zones.each do |zone|
      zone_list << { "id" => zone.vendor_network_id}
    end
    hsh = {"scheduleTime" => upgrade_obj.time_zone, "targetVersion" => upgrade_obj.version, "zoneList" => zone_list }
  end

  def get_acl_group acl_obj
    l3_acl_rule_list = []
    acl_obj.access_control_lists.each do |layer|
      l3_acl_rule_list << { "description" => "acl rule description",
                            "enableSourceIpSubnet" => "", 
                            "sourceIp" => layer.src_ip, 
                            "sourceIpMask" => layer.scr_bitmask, 
                            "enableSourcePortRange" => layer.src_port,
                            "sourceMinPort" => layer.port,
                            "enableDestinationPortRange" => layer.dst_port,
                            "destinationIp" => layer.dst_ip,
                            "destinationIpMask" => layer.dst_bitmask,
                            "protocol" => layer.protocol,
                            "action" => layer.policy,
                            "direction" => ""
                          }
    end
    hsh = {"domainId" => acl_obj.location_network.vendor_network_id, "name" => acl_obj.group_name, "description" => "l3 description", "l3AclRuleList" => l3_acl_rule_list}
  end

  
  def self.hotspot_wlan_params ssid
     auth_radius = Radius.where(:id=>ssid.auth_radius_id).last
     acct_radius = RadiusAccounting.where(:id=>ssid.acc_radius_id).last
    return {"name"=> ssid.ssid_name, "ssid"=> ssid.ssid_name, "description"=> ssid.ssid_name, "type"=> "Hotspot", "bypassCNA"=> false, "encryption"=> { "method"=> MSECURITY[ssid.security_mode]}, "authServiceOrProfile" => {"id" => auth_radius.vendor_details["id"],"name" => auth_radius.radius_name},"accountingServiceOrProfile" => {"id" => acct_radius.vendor_details["id"],"name" => acct_radius.radius_name} }

  end

  def self.radius_mapping radius
    return { "name"=> radius.radius_name, "primary"=> {"ip"=> radius.radius_ip,"port"=> radius.radius_port.to_i,"sharedSecret"=> radius.radius_secret}}
  end

  def self.get_external_hotspot_params ssid
    { "name" => ssid.ssid_name, "smartClientSupport" => "None", "portalUrl" => ssid.splash_url, "macAddressFormat" => 2, "walledGardens" => ssid.walled_garden_range.split(","),"httpsRedirect" => true, "redirect"=>{"url"=>ssid.success_url},"userSession"=>{"gracePeriodInMin"=>ssid.default_idle_timeout.to_i/60,"timeoutInMin"=>(ssid.default_idle_timeout.to_i/60 + 10.minutes)}}
  end


  def self.web_authentication ssid
    { "name" => ssid.ssid_name, "smartClientSupport" => "None", "portalUrl" => ssid.splash_url, "macAddressFormat" => 2, "walledGardens" => ssid.walled_garden_range.split(","),"httpsRedirect" => true, "redirect"=>{"url"=>ssid.success_url},"userSession"=>{"gracePeriodInMin"=>ssid.default_idle_timeout}}
  end


  def self.get_ap_params network, macid
    return { "mac" => macid, "zoneId" => network.vendor_network_id}
  end

  def self.move_multiple_aps network, device_serials
    return {"targetZoneId" => network.vendor_network_id, "apMacs"=>device_serials}
  end

  def self.static_uplink uplink
    return { "network" => { "ipType" =>  "Static", "ip"=> uplink, "netmask"=> "255.255.255.0", "gateway"=> "1.1.1.0", "primaryDns"=> "8.8.8.8", "secondaryDns"=> "8.8.8.9"}}
  end

#

  def self.radio_config radio
    return "radioConfig" => self.radio_config24(radio.radio_settings.where(:band=>"2.4").last).merge(self.radio_config5(radio.radio_settings.where(:band=>"5").last)).merge(self.radio_config6(radio.radio_settings.where(:band=>"6").last))
  end

  def self.radio_config24 radios
    return {} if radios.blank?
    return "radio24g"=> {"autoCellSizing"=> radios.channel_utlilization == "false" ? false : true, "txPower"=> (POWERTX[radios.power.to_s].blank? ? "Full" : POWERTX[radios.power.to_s]), "channelWidth"=> radios.bandwidth.to_i, "channel"=> radios.channel,"channelRange"=> radios.valid_auto_channel.reject(&:empty?).empty? ? [6] : radios.valid_auto_channel.reject(&:empty?).map(&:to_i),"wlanServiceEnabled"=> !radios.is_disable}
  end

  def self.radio_config5 radios
    return {} if radios.blank?
    return "radio5g"=> {"autoCellSizing"=> radios.channel_utlilization == "false" ? false : true, "txPower"=> (POWERTX[radios.power].blank? ? "Full" : POWERTX[radios.power]), "channelWidth"=> radios.bandwidth.to_i, "channel"=> radios.channel,"channelRange"=> radios.valid_auto_channel.reject(&:empty?).empty? ? [0] : radios.valid_auto_channel.reject(&:empty?).map(&:to_i),"wlanServiceEnabled"=> !radios.is_disable}
  end

 def self.radio_config6 radios
    return {} if radios.blank?
    return "radio6g"=> {"autoCellSizing"=> radios.channel_utlilization == "false" ? false : true, "txPower"=> (POWERTX[radios.power].blank? ? "Full" : POWERTX[radios.power]), "channelWidth"=> radios.bandwidth.to_i, "channel"=> radios.channel,"channelRange"=> radios.valid_auto_channel.reject(&:empty?).empty? ? [0] : radios.valid_auto_channel.reject(&:empty?).map(&:to_i),"wlanServiceEnabled"=> !radios.is_disable}
  end


  def self.enable_wlan_params ssid
    return {"schedule" => { "type"=> "AlwaysOn"}}
  end

  def self.disable_wlan_params ssid
    return {"schedule" => { "type"=> "AlwaysOff"}}
  end 

  
  def self.get_wlan_params ssid,ln
    wlanendpoint = "wlans"
    encryption = {"method"=> MSECURITY[ssid.security_mode]}
    ssid_map = {"name"=> ssid.ssid_name, "ssid"=> ssid.ssid_name, "description"=> ssid.ssid_name}
    if ssid.security_mode == 'psk2'
      encryption['algorithm'] = "AES"
      encryption['passphrase'] = ssid.wpa_key
      encryption['mfp'] = W80211[ssid.ssid_802_11_w]
    end
    ssid_map["encryption"] = encryption if ssid.security_mode == 'psk2' && ssid.multi_psk != "radius"
   if ssid.multi_psk == "radius" && ssid.security_mode == 'psk2'
     Rails.logger.info "------------------ IN DPSK --------------"
     auth_radius, acct_radius = self.get_radius_details ssid, ln
     ssid_map["externalDpsk"] = { "enabled" => true, "encryption" => encryption,"authService" => { "id" => auth_radius.vendor_details["id"]}}
     Rails.logger.info "------------------ IN DPSK -------------- #{ssid_map}"
   end
   
    if ssid.ssid_mode == "0" && !ssid.v_lan.blank? && !ssid.v_lan.v_lan_id.blank?
      ssidvlan = (ssid.v_lan.v_lan_id == "0") ? 1 : ssid.v_lan.v_lan_id.to_i
      ssid_map["vlan"] = {"accessVlan"=> ssidvlan}
    end

   if ssid.captive_portal.to_i != 0
     cpservice = self.get_cp_services(ssid, ln)
     Rails.logger.info "------------------ IN CP -------------- #{cpservice}"
     ssid_map = ssid_map.merge(cpservice) unless cpservice.blank?
     wlanendpoint = "wlans/wispr" unless cpservice.blank?
     Rails.logger.info "------------------ IN CP -------------- #{ssid_map}"
    end

    ssid_map["advancedOptions"] = {"clientIsolationEnabled"=>ssid.is_isolate, "hideSsidEnabled"=>ssid.is_hidden, "bandBalancing"=>BANDBALANCING[ssid.band_steering],"support80211kEnabled"=>ssid.ssid_802_11_k}
    return ssid_map,wlanendpoint
  end

  def self.get_cp_services ssid, ln
      auth_radius, acct_radius = self.get_radius_details ssid, ln
      portalservice = self.get_portal_service(ssid, ln)
      return if portalservice.blank? || auth_radius.blank?
      return { "authServiceOrProfile" => {"id" => auth_radius.vendor_details["id"],"name" => auth_radius.radius_name,"throughController"=>true},"accountingServiceOrProfile" => {"id" => acct_radius.vendor_details["id"],"name" => acct_radius.radius_name,"interimUpdateMin"=>ssid.default_interim_time.to_i/60, "throughController"=>true,"accountingDelayEnabled"=>false}, "portalServiceProfile"=>{"id"=>portalservice},"radiusOptions"=>{"nasIdType"=>"AP_MAC","nasIpType"=>"control","singleSessionIdAcctEnabled"=>true} }
  end

  def self.get_radius_details ssid, ln
    return [self.check_radius_status(ssid, ln, "auth"), self.check_radius_status(ssid, ln,"acct")]
  end

  def self.check_radius_status ssid, ln, type
      radius = ("auth" == type) ? Radius.where(:id=>ssid.auth_radius_id).last : RadiusAccounting.where(:id=>ssid.acc_radius_id).last
      p radius.inspect
      Rails.logger.info "11111111----------------------#{radius.inspect}"
      return nil if radius.blank?
      return radius if !radius.vendor_details.blank? && !radius.vendor_details['id'].blank?
      Ruckus::ConfigurationService.new(ln).create_radius radius, type
      return radius
  end

  def self.get_radius_params auth_radius,type
    return self.radius_mapping auth_radius
  end

  def self.get_portal_service ssid, ln
    if ssid.vendor_details.blank? || ssid.vendor_details["external_hotspot"].blank?
        Ruckus::ConfigurationService.new(ln).create_wlan_external_hotspot ssid
    else
        Ruckus::ConfigurationService.new(ln).update_wlan_external_hotspot ssid
    end
    return ssid.vendor_details.blank? ? nil : ssid.vendor_details["external_hotspot"]
  end


end
