class PresenceAnalytic
 include Mongoid::Document
 HOURLY_DATA = {0=>{"tv"=>0, "tust"=>0}, 1=>{"tv"=>0, "tust"=>0}, 2=>{"tv"=>0, "tust"=>0}, 3=>{"tv"=>0, "tust"=>0}, 4=>{"tv"=>0, "tust"=>0}, 5=>{"tv"=>0, "tust"=>0}, 6=>{"tv"=>0, "tust"=>0}, 7=>{"tv"=>0, "tust"=>0}, 8=>{"tv"=>0, "tust"=>0}, 9=>{"tv"=>0, "tust"=>0}, 10=>{"tv"=>0, "tust"=>0}, 11=>{"tv"=>0, "tust"=>0}, 12=>{"tv"=>0, "tust"=>0}, 13=>{"tv"=>0, "tust"=>0}, 14=>{"tv"=>0, "tust"=>0}, 15=>{"tv"=>0, "tust"=>0}, 16=>{"tv"=>0, "tust"=>0}, 17=>{"tv"=>0, "tust"=>0}, 18=>{"tv"=>0, "tust"=>0}, 19=>{"tv"=>0, "tust"=>0}, 20=>{"tv"=>0, "tust"=>0}, 21=>{"tv"=>0, "tust"=>0}, 22=>{"tv"=>0, "tust"=>0}, 23=>{"tv"=>0, "tust"=>0}}

 field :d, type: Date
 field :h, type: Hash, :default => HOURLY_DATA
 field :daily, type: Hash, :default =>{"nv"=>{"v"=>0,"store"=>0,"walk"=>0,"regv"=>0},"rv"=>{"v"=>0,"store"=>0, "walk"=>0,"regv"=>0}}
 field :ap, type: String
 
 index({"ap" => 1, "d"=>1 }, { background: true })

  def self.saving_data_per_hour(ust_f)
    # s={"UTC"=>["00:0C:66:10:38:20","04:F0:21:12:18:35"]}
    self.horst_hourly(ust_f,self.grop_by_aps_zone)
  end

  def self.grop_by_aps_zone
    mac_ids = RouterLocation.pluck(:mac_id).uniq
    rl_mac_ids = "'#{mac_ids.join("','")}'"
    s={}
    Location.find(:all,:select=>"mac_id,zone_name", :conditions=>"mac_id in (#{rl_mac_ids}) ").collect do |d| 
      mac_ids.delete(d.mac_id.upcase)
      s[d.zone_name].blank? ? s[d.zone_name] = [d.mac_id.upcase] : s[d.zone_name] << d.mac_id.upcase 
    end
    time_zone = APPLICATION['defaults']['default_time_zone']
    s.blank? ? s[time_zone]=mac_ids : (mac_ids.blank? ? "" : (s[time_zone].blank? ? s[time_zone] = mac_ids : s[time_zone] = (s[time_zone] + mac_ids).uniq))
    return s
  end

  def self.horst_hourly(ust_f,aps_zone)
    aps_zone.each do |time_zone, mac_ids|
      next if mac_ids.blank?
      s_h = (ust_f.beginning_of_hour - 1.hour).in_time_zone(time_zone).beginning_of_hour
      e_h = s_h + 1.hour
      # this will return total visitor's count, total user's stayed time
      a=[]
      Blacklist.where(:ap=>{"$in" => mac_ids.uniq}).map{|x| a << x.vap}
      lists = []
      lists=UserStayedTime.where(:rl_mac_id=>{"$in" => mac_ids.uniq}, :stayedtime=>{"$gte" => APPLICATION['defaults']['dwell_time']}, :vd_mac_id=>{"$nin"=>a.flatten.uniq}, "$or" => [{"$and" => [{:starttime.gte => s_h}, {:starttime.lt => e_h}]}, {"$and" => [{:endtime.gt => s_h}, {:endtime.lt => e_h}]}]).get_visitors_count_n_sttime(s_h.to_i, e_h.to_i)
      (lists || []).each do |ust|
          a = self.find_or_create_by({"ap"=>ust["_id"], "d"=>s_h.to_date})
          a.inc({"h.#{s_h.hour}.tv" => ust["value"]["tv"].to_i, "h.#{s_h.hour}.tust" => ust["value"]["sttm"].to_i})
      end
      self.saving_data_per_day(s_h,time_zone,mac_ids) if s_h.hour == 23
    end
  end

  def self.saving_data_per_day(s_h,time_zone,mac_ids)
    # RealTimeEmail.where(:d=>s_h.yesterday, :status=>false).delete_all
    s_h = s_h.beginning_of_day
    e_h = s_h + 1.day

    lists = UserStayedTime.collection.aggregate({"$match" => {"starttime"=> { "$gte" => s_h, "$lt" => e_h}, "rl_mac_id" => {"$in" => mac_ids.uniq} }}, {"$project"=>{"stayedtime"=>1, "return_flag"=>1, "register_flag"=>1, "rl_mac_id"=>1, "vd_mac_id"=>1 }},{"$group"=>{"_id"=>"$rl_mac_id", "visited_next"=>{"$addToSet"=>{"$cond"=> [ {"$and" => [ { "$gte"=> [ "$stayedtime", 300 ] },{"$eq"=> ["$return_flag", 1]}]}, "$vd_mac_id", nil ]}},"walk_next"=>{"$addToSet"=>{"$cond"=> [ {"$and" => [ { "$lt"=> [ "$stayedtime", 300 ] },{"$eq"=> ["$return_flag", 1]}]}, "$vd_mac_id", nil ]}},"visited_new"=>{"$addToSet"=>{"$cond"=> [ {"$and" => [ { "$gte"=> [ "$stayedtime", 300 ] },{"$eq"=> ["$return_flag", 0]} ]}, "$vd_mac_id", nil ]}},"walk_new"=>{"$addToSet"=>{"$cond"=> [ {"$and" => [ { "$lt"=> [ "$stayedtime", 300 ] },{"$eq"=> ["$return_flag", 0]} ]}, "$vd_mac_id", nil ]}},"store_reg"=>{"$addToSet"=>{"$cond"=> [ {"$and" => [ {"$gte"=> [ "$stayedtime", 300 ] },{"$eq"=> ["$return_flag", 1]},{"$eq"=> ["$register_flag", 1]}]}, "$vd_mac_id", nil ]}},"non_store_reg"=>{"$addToSet"=>{"$cond"=> [ {"$and" => [ {"$lt"=> [ "$stayedtime", 300 ] },{"$eq"=> ["$return_flag", 0]},{"$eq"=> ["$register_flag", 1]}]}, "$vd_mac_id", nil ]}}}},{"$project"=>{"vnxt"=>{"$size"=>"$visited_next"},"wnxt"=>{"$size"=>"$walk_next"},"vnw"=>{"$size"=>"$visited_new"},"wnw"=>{"$size"=>"$walk_new"},"sr"=>{"$size"=>"$store_reg"},"nsr"=>{"$size"=>"$non_store_reg"}}})

    (lists || []).each do |ust|
      a = PresenceAnalytic.find_or_create_by({"ap"=>ust["_id"], "d"=>s_h.to_date})
      a.inc({"daily.nv.v"=>((ust["vnw"]  + ust["wnw"]) - 2),"daily.nv.store"=>(ust["vnw"] - 1),"daily.nv.walk"=>(ust["wnw"] - 1),"daily.nv.regv"=>(ust["nsr"] - 1) ,"daily.rv.v"=>((ust["vnxt"] + ust["wnxt"]) - 2),"daily.rv.store"=>(ust["vnxt"] - 1),"daily.rv.walk"=>(ust["wnxt"] - 1),"daily.rv.regv"=>(ust["sr"] - 1) })
    end
  end
end