class Meraki::Platform::ConfigurationService < Meraki::BaseApi

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

  def fetch_organizations
    response = MerakiApi.send_request @api_key, 'GET', MerakiApi::ENDPOINT[:organizations], {}, {}
    response
  end

  def create_organization_network
    params = Meraki::Platform::ObjectMapper.get_network_params @ln

    response = MerakiApi.make_api_call @api_key, "organizations/#{@vendor_org_id}/networks", 'POST', params
    Rails.logger.info response
    if response.present? && response['id'].present?
      @ln.vendor_network_id = response['id'].to_s
      @ln.save

      Rails.logger.info "[MERAKI][#{@ln.vendor_network_id}] Network created sucessfully"      

      #Sync default SSID's for new network
      # default_ssids = Meraki::Wireless::ConfigurationService.new(@ln).get_network_ssids
      # if default_ssids.present?
      #   res = Meraki::Wireless::ConfigurationService.new(@ln).sync_meraki_ssids default_ssids
      #   Rails.logger.info "[MERAKI][#{@ln.vendor_network_id}] Default sssids created successfully.. from controller ! #{default_ssids}"
      # end
      self.sync_ssids
    else
        Rails.logger.info "[MERAKI][#{@ln.network_name}] Network not created"
    end
  end

  def update_network
    params = Meraki::Platform::ObjectMapper.get_updated_network_params @ln

    if params.present?
      response = MerakiApi.make_api_call @api_key, "networks/#{@ln.vendor_network_id}", 'PUT', params
      Rails.logger.info response
      if response.present? && response['id'].present?
        response
        Rails.logger.info "[MERAKI][#{@ln.vendor_network_id}] Network updated sucessfully"      
      else
        Rails.logger.info "[MERAKI][#{@ln.vendor_network_id}] Network update is failed"
      end
    end
  end

  def delete_network
    response = MerakiApi.make_api_call @api_key, "networks/#{@ln.vendor_network_id}", 'DELETE', {}

    Rails.logger.info "[MERAKI][#{@ln.vendor_network_id}][delete] :: #{response}"
    response
  end

  def claim_network_device device_serials
    params = {
      "serials" => device_serials
    }

    response = MerakiApi.make_api_call @api_key, "networks/#{@ln.vendor_network_id}/devices/claim", 'POST', params

    Rails.logger.info "[MERAKI][#{@ln.vendor_network_id}][device claim] :: #{response}"
    response
  end

  def self.claim_device_into_organization org, device_serials
    @meraki_config = org.integration_types.where(vendor_name: "meraki").first
    @vendor_org_id = @meraki_config.org_id
    @api_key = @meraki_config.api_key

    params = {
      "serials" => device_serials
    }

    response = MerakiApi.make_api_call @api_key, "organizations/#{@vendor_org_id}/claim", 'POST', params

    Rails.logger.info "[MERAKI][#{@vendor_org_id}][device claim] :: #{response}"

    response
  end

  def get_network_devices
    response = MerakiApi.make_api_call @api_key, "networks/#{@ln.vendor_network_id}/devices", 'GET', {}

    Rails.logger.info "[MERAKI][#{@ln.vendor_network_id}][network devices] :: #{response}"

    response
  end

  def self.get_organization_devices org, serials
    @meraki_config = org.integration_types.where(vendor_name: "meraki").first
    @vendor_org_id = @meraki_config.org_id
    @api_key = @meraki_config.api_key
    
    response = MerakiApi.make_api_call @api_key, "organizations/#{@vendor_org_id}/devices", 'GET', {}#{"serials" => serials}

    Rails.logger.info "[MERAKI][#{@vendor_org_id}][network devices] :: #{response}"

    response
  end

  def remove_network_device serial
    params = {
      "serial" => serial
    }
    Rails.logger.info "[MERAKI] --------------------- #{params}"
    response = MerakiApi.make_api_call @api_key, "networks/#{@ln.vendor_network_id}/devices/remove", 'POST', params

    Rails.logger.info "[MERAKI][#{@ln.vendor_network_id}][device remove] :: #{response}"
    response
  end
 
  def update_device_attributes(serial_number,tag_lists,action)
    params = {
       "tags" => tag_lists
       }
    response = MerakiApi.make_api_call @api_key, "devices/#{serial_number}", 'PUT', params
    Rails.logger.info "[MERAKI][#{serial_number}][device update] :: #{response}"
    response
  end

  def self.sync_all_devices org
    Rails.logger.info "Sync All Devices Sarts::"
    @meraki_config = org.integration_types.where(vendor_name: "meraki").first
    @vendor_org_id = @meraki_config.org_id
    @api_key = @meraki_config.api_key
    Rails.logger.info "vendor_org_idvendor_org_id #{@vendor_org_id}"
    val = MerakiApi.make_api_call(@api_key, "organizations/#{@vendor_org_id}/devices", 'GET', {})
    val.each do |dev|
      dev_mac = dev["mac"].upcase
      loc_nw = LocationNetwork.where(:vendor_network_id => dev["networkId"],organisation_id: org.id).first
      if loc_nw.present?  
        devices = loc_nw.router_inventories.pluck(:mac_id)
        router = [dev_mac, loc_nw.try(:id), org.id]
        if !devices.include?(dev_mac)
          Rails.logger.info "New :: Device(#{dev_mac}) Added with Network(#{loc_nw.network_name}) "
          macc, status = RouterInventory.meraki_routers_activation(router, dev)
        else
          Rails.logger.info "Already Exisit:: Device(#{dev_mac}) Added with Network(#{loc_nw.network_name}) "
        end
      else
        router = [dev_mac, nil, org.id]
        Rails.logger.info "New :: Device(#{dev_mac}) Added without Network "
        macc, status = RouterInventory.meraki_routers_activation(router, dev)
      end
    end
  end

  def sync_ssids
    #Sync default SSID's for new network
    default_ssids = Meraki::Wireless::ConfigurationService.new(@ln).get_network_ssids
    if default_ssids.present?
      res = Meraki::Wireless::ConfigurationService.new(@ln).sync_meraki_ssids default_ssids
      Rails.logger.info "[MERAKI][#{@ln.vendor_network_id}] Default sssids created successfully.. from controller ! #{default_ssids}"
    end
  end

  def self.sync_networks org
    meraki_config = org.integration_types.where(vendor_name: "meraki").first
    vendor_org_id = meraki_config.org_id
    api_key = meraki_config.api_key
    
    all_networks = MerakiApi.make_api_call(api_key, "organizations/#{vendor_org_id}/networks", 'GET', {})
    all_networks.each do |nw|
      hsh = {}
      hsh[:network_name] = nw["name"]
      hsh[:vendor_network_id] = nw["id"]
      hsh[:organisation_id] = org.id
      hsh[:timezone] = nw["timeZone"]
      hsh[:vendor_type] = "3"
      hsh[:network_configuration] = "meraki"
      hsh[:vendor_details] = nw
      network = org.location_networks.where(:vendor_network_id => nw["id"]).first
      if network.present?
        network.update_attributes(hsh)
        Rails.logger.info ":::::::::::::::::::::::::::::::::::::_________ locationNetwork updated #{hsh}"
      else
        network = LocationNetwork.create(hsh)
        Rails.logger.info "**************************************locationNetwwork created #{hsh}"
      end

      self.new(network).sync_ssids
    end
  end
end