class ApAggregateData 
  include Mongoid::Document

  field :mac, type: String
  field :ln, type: Integer
  field :hr, type: Array, default: [] #=> [{'h' => 23, 'tx_r' => 0, 'rx_r' => 0, 'tx_u' => 0, 'rx_u' => 0, 'a_av' => 0, 'a_mi' => 0, 'a_mx' => 0}....]
  field :d, type: Date

  index({"mac" => 1, "ln" => 1, "d" => 1}, { background: true })
  index({"ln" => 1, "d" => 1}, { background: true })
 
  def self.save_hourly_data st, mac_ids, ln_id, hourly=true
    #To Find TX_R, RX_R, TX_U, RX_U, AIR, CLI
    #aggregate_data = MonitoringChild.collection.aggregate({"$match" => {"monitoring_data.INFO.NASID" => {"$in" => ["12:11:11:11:11:11"]}, "monitoring_data.present_date" => {"$gte" => st.to_i, "$lt" => et.to_i}}}, {"$project" => {'ap' => "$monitoring_data.INFO.NASID", 'clients' => "$monitoring_data.WLAN_CLIENTS.MAC", "tx_u" => "$monitoring_data.INTERFACE_STATS.LAN.TX_BYTES_INT", "tx_r" => "$monitoring_data.INTERFACE_STATS.LAN.TX_RATE", "rx_u" => "$monitoring_data.INTERFACE_STATS.LAN.RX_BYTES_INT", "rx_r" => "$monitoring_data.INTERFACE_STATS.LAN.RX_RATE", "voc" => "$monitoring_data.SENSORS_DATA.AIR_DATA.VOC"}}, {"$unwind" => "$clients"}, {"$group" => {"_id" => "$ap", "tx_u" => {"$sum" => "$tx_u"}, "tx_r" => {"$avg" => "$tx_r"}, "rx_u" => {"$sum" => "$rx_u"}, "rx_r" => {"$avg" => "$rx_r"}, 'clients' => {"$addToSet" => "$clients"}, "a_avg" => {"$avg" => "$voc"}, "a_max" => {"$max" => "$voc"}, "a_min" => {"$min" => "$voc"}}}, {"$project" => {"_id" => 1, "tx_u" => 1, "tx_r" => 1, "rx_u" => 1, "rx_r" => 1, "clients" => {"$size" => "$clients"}, "air" => {"avg" => "$a_avg","max" => {"$ifNull" => ["$a_max", 0]},"min" => {"$ifNull" => ["$a_min", 0]}}}})
    col = hourly ? MonitoringDataCapped : MonitoringChild
    aggregate_data = col.collection.aggregate({"$match" => {"info.NASID" => {"$in" => mac_ids},
                                                                        "created_at" => {"$gte" => st.utc, "$lt" => (st + 1.hour).utc}}},
                                                          {"$project" => {"info.NASID" => 1,
                                                                          "sensor_data.AIR_DATA.VOC" => 1, 
                                                                          "uplink" => {"$ifNull" => [ "$uplink", "$lan" ]}}},
                                                          {"$unwind" => "$uplink"},
                                                          {"$project" => {'ap' => "$info.NASID", 
                                                                          "tx_u" => "$uplink.TX_BYTES_INT",
                                                                          "tx_r" => "$uplink.TX_RATE",
                                                                          "rx_u" => "$uplink.RX_BYTES_INT",
                                                                          "rx_r" => "$uplink.RX_RATE",
                                                                          "voc" => "$sensor_data.AIR_DATA.VOC"}},
                                                          {"$group" => {"_id" => "$ap",
                                                                        "tx_u" => {"$sum" => "$tx_u"},
                                                                        "tx_r" => {"$avg" => "$tx_r"},
                                                                        "rx_u" => {"$sum" => "$rx_u"},
                                                                        "rx_r" => {"$avg" => "$rx_r"},
                                                                        "a_avg" => {"$avg" => "$voc"},
                                                                        "a_max" => {"$max" => "$voc"},
                                                                        "a_min" => {"$min" => "$voc"}}},
                                                          {"$project" => {"_id" => 1, 
                                                                          "tx_u" => 1,
                                                                          "tx_r" => 1,
                                                                          "rx_u" => 1,
                                                                          "rx_r" => 1,
                                                                          "air" => {"avg" => "$a_avg", 
                                                                                    "max" => {"$ifNull" => ["$a_max", 0]},
                                                                                    "min" => {"$ifNull" => ["$a_min", 0]}}}})
    aggregate_data.each do |d|
      self.collection.where({"mac" => d['_id'], "ln" => ln_id, "d" => st.to_date})
                         .update( {"$push" => {"hr" => {'h' => st.hour.to_i,
                                                        'tx_r' => d["tx_r"],
                                                        'tx_u' => d["tx_u"], 
                                                        'rx_r' => d["rx_r"],
                                                        'rx_u' => d["rx_u"],
                                                        #'c' => d['clients'], 
                                                        'a_av' => d['air']['avg'],
                                                        'a_mi' => d['air']['min'], 
                                                        'a_mx' => d['air']['max']}}}, [:upsert] )
    end
  end

  def aps_throughput lns, aps, sd, ed
    if ed - sd < 2.days
      group_by = {"h" => "$hr.h", "d" => {"$dayOfMonth" => "$d"}}
    else
      group_by = {"d" => {"$dayOfMonth" => "$d"}}
    end
    
    ApAggregateData.collection.aggregate({"$match" => {"ln" => {"$in" => lns}, "mac"=>{"$in"=> aps}, "d" => {"$gte"=> sd, "$lt"=> ed }}}, {"$project" => {"mac" => 1, "hr.h" => 1, "hr.tx_r" => 1, "hr.rx_r" => 1, "d" => 1}}, {"$unwind" => "$hr"}, {"$group" => {"_id" => group_by, "tx" => {"$avg" => "$hr.tx_r"}, "rx" => {"$avg" => "$hr.rx_r"}}}, {"$sort" => {"_id.d" => 1}})
  end
end
