
class ClientDevice
  include Mongoid::Document

  field :name, type: String
  field :original_name, type: String
  field :nick_name, type: String
  field :description, type: String
  field :ip, type: String
  field :mac, type: String
  field :monitoring, type: Boolean
  field :critical, type: Integer
  field :org_id, type: Integer
  field :nas_id, type: String
  field :is_blocked, type: Boolean, default: false
  field :ln_id, type: Integer
  
  index({"name" => 1, "ip" => 1, "mac" => 1}, { background: true })

  CRIT_LVL = {1 => "Non Critical", 2 => " Critical Low", 3 => "Critical High"}
  
  
  def update_redis
    if self.is_blocked?
      $redis.sadd("LN:#{self.ln_id}:BLOCKED:CLIENTS:LIST", "#{self.mac}")
    else
      $redis.srem("LN:#{self.ln_id}:BLOCKED:CLIENTS:LIST", "#{self.mac}")
    end
    acl = []
    clis = $redis.smembers("LN:#{self.ln_id}:BLOCKED:CLIENTS:LIST")
    clis.each do |cld|
      acl << {"PROTO"=>"TCP", "SRC_IPADDR"=>"", "SRC_BITMASK"=>"", "SRC_PORT"=>"", "SRC_LIST"=>"", "DST_LIST"=>"", "DST_IPADDR"=>nil, "DST_BITMASK"=>"", "DST_PORT"=>"", "POLICY"=>0, "SRC_UL_MODE"=>"0", "DST_UL_MODE"=>"0", "LOG"=>1, "SRC_MAC" => cld}.to_json  
      acl << {"PROTO"=>"UDP", "SRC_IPADDR"=>"", "SRC_BITMASK"=>"", "SRC_PORT"=>"", "SRC_LIST"=>"", "DST_LIST"=>"", "DST_IPADDR"=>nil, "DST_BITMASK"=>"", "DST_PORT"=>"", "POLICY"=>0, "SRC_UL_MODE"=>"0", "DST_UL_MODE"=>"0", "LOG"=>1, "SRC_MAC" => cld}.to_json
    end
    $redis.set("LN:#{self.ln_id}:ACL:BLOCK:CLIENTS", acl.to_json)
    routers = RouterInventory.where(location_network_id: self.ln_id)
    (routers.uniq||[]).each do |y|
      y.update_redis unless y.blank?
    end
  end

  after_create do |x|
    x.update_redis if x.is_blocked?
  end

  after_update do |x|
    x.update_redis if x.is_blocked_changed?
  end
 
 def self.save_data data
  cd = self.new
  cd.name = data["name"]
  cd.nick_name = data["nick_name"]
  cd.mac = data["mac"]
  cd.original_name = data["original_name"]
  cd.description = data["description"]
  cd.critical = data["critical"]
  cd.monitoring = data["monitoring"]
  cd.org_id = data["org_id"]
  cd.ip = data["ip"]
  cd.nas_id = data["nas_id"]
  cd.is_blocked = data["is_blocked"].nil? ? false : data["is_blocked"]
  cd.ln_id = data["ln_id"]
  cd.save
  return cd
 end

 def self.update_data obj, data
  cd = obj
  cd.name = data["name"]
  cd.nick_name = data["nick_name"]
  cd.mac = data["mac"]
  cd.original_name = data["original_name"]
  cd.description = data["description"]
  cd.critical = data["critical"]
  cd.monitoring = data["monitoring"]
  cd.org_id = data["org_id"]
  cd.ip = data["ip"]
  cd.nas_id = data["nas_id"]
  cd.is_blocked = data["is_blocked"] unless data["is_blocked"].nil?
  cd.save
 end

 def json_build
    {id: self.id, name: self.name, nick_name: self.nick_name, mac: self.mac, original_name: self.original_name, description: self.description, critical: self.critical, monitoring: self.monitoring, org_id: self.org_id, ip: self.ip, nas_id: self.nas_id, is_blocked: self.is_blocked}
  end 

 def self.get_all org_id
  ClientDevice.where(:org_id => org_id).to_a
 end


 def self.monitoring_details org_id
  ClientDevice.where(:monitoring => true, :org_id => org_id).to_a
 end
end

