//
// Created by stephane bourque on 2022-01-10.
//

#include "RESTAPI_AnalyticsObjects.h"
#include "RESTAPI_ProvObjects.h"
#include "framework/RESTAPI_utils.h"

using OpenWifi::RESTAPI_utils::field_from_json;
using OpenWifi::RESTAPI_utils::field_to_json;

namespace OpenWifi::AnalyticsObjects {

	void Report::reset() {}

	void Report::to_json([[maybe_unused]] Poco::JSON::Object &Obj) const {}

	void VenueInfo::to_json(Poco::JSON::Object &Obj) const {
		field_to_json(Obj, "id", id);
		field_to_json(Obj, "name", name);
		field_to_json(Obj, "description", description);
		field_to_json(Obj, "retention", retention);
		field_to_json(Obj, "interval", interval);
		field_to_json(Obj, "monitorSubVenues", monitorSubVenues);
	}

	bool VenueInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
		try {
			field_from_json(Obj, "id", id);
			field_from_json(Obj, "name", name);
			field_from_json(Obj, "description", description);
			field_from_json(Obj, "retention", retention);
			field_from_json(Obj, "interval", interval);
			field_from_json(Obj, "monitorSubVenues", monitorSubVenues);
			return true;
		} catch (...) {
		}
		return false;
	}

	void BoardInfo::to_json(Poco::JSON::Object &Obj) const {
		info.to_json(Obj);
		field_to_json(Obj, "venueList", venueList);
	}

	bool BoardInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
		try {
			info.from_json(Obj);
			field_from_json(Obj, "venueList", venueList);
			return true;
		} catch (...) {
		}
		return false;
	}

	void DeviceInfo::to_json(Poco::JSON::Object &Obj) const {
		field_to_json(Obj, "boardId", boardId);
		field_to_json(Obj, "type", type);
		field_to_json(Obj, "serialNumber", serialNumber);
		field_to_json(Obj, "deviceType", deviceType);
		field_to_json(Obj, "lastContact", lastContact);
		field_to_json(Obj, "lastPing", lastPing);
		field_to_json(Obj, "lastState", lastState);
		field_to_json(Obj, "lastFirmware", lastFirmware);
		field_to_json(Obj, "lastFirmwareUpdate", lastFirmwareUpdate);
		field_to_json(Obj, "lastConnection", lastConnection);
		field_to_json(Obj, "lastDisconnection", lastDisconnection);
		field_to_json(Obj, "pings", pings);
		field_to_json(Obj, "states", states);
		field_to_json(Obj, "connected", connected);
		field_to_json(Obj, "connectionIp", connectionIp);
		field_to_json(Obj, "associations_2g", associations_2g);
		field_to_json(Obj, "associations_5g", associations_5g);
		field_to_json(Obj, "associations_6g", associations_6g);
		field_to_json(Obj, "health", health);
		field_to_json(Obj, "lastHealth", lastHealth);
		field_to_json(Obj, "locale", locale);
		field_to_json(Obj, "uptime", uptime);
		field_to_json(Obj, "memory", memory);
	}

	bool DeviceInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
		try {
			field_from_json(Obj, "boardId", boardId);
			field_from_json(Obj, "type", type);
			field_from_json(Obj, "serialNumber", serialNumber);
			field_from_json(Obj, "deviceType", deviceType);
			field_from_json(Obj, "lastContact", lastContact);
			field_from_json(Obj, "lastPing", lastPing);
			field_from_json(Obj, "lastState", lastState);
			field_from_json(Obj, "lastFirmware", lastFirmware);
			field_from_json(Obj, "lastFirmwareUpdate", lastFirmwareUpdate);
			field_from_json(Obj, "lastConnection", lastConnection);
			field_from_json(Obj, "lastDisconnection", lastDisconnection);
			field_from_json(Obj, "pings", pings);
			field_from_json(Obj, "states", states);
			field_from_json(Obj, "connected", connected);
			field_from_json(Obj, "connectionIp", connectionIp);
			field_from_json(Obj, "associations_2g", associations_2g);
			field_from_json(Obj, "associations_5g", associations_5g);
			field_from_json(Obj, "associations_6g", associations_6g);
			field_from_json(Obj, "health", health);
			field_from_json(Obj, "lastHealth", lastHealth);
			field_from_json(Obj, "locale", locale);
			field_from_json(Obj, "uptime", uptime);
			field_from_json(Obj, "memory", memory);
			return true;
		} catch (...) {
		}
		return false;
	}

	void DeviceInfoList::to_json(Poco::JSON::Object &Obj) const {
		field_to_json(Obj, "devices", devices);
	}

	bool DeviceInfoList::from_json(const Poco::JSON::Object::Ptr &Obj) {
		try {
			field_from_json(Obj, "devices", devices);
			return true;
		} catch (...) {
		}
		return false;
	}

	void UE_rate::to_json(Poco::JSON::Object &Obj) const {
		field_to_json(Obj, "bitrate", bitrate);
		field_to_json(Obj, "mcs", mcs);
		field_to_json(Obj, "nss", nss);
		field_to_json(Obj, "ht", ht);
		field_to_json(Obj, "sgi", sgi);
		field_to_json(Obj, "chwidth", chwidth);
	}

	bool UE_rate::from_json(const Poco::JSON::Object::Ptr &Obj) {
		try {
			field_from_json(Obj, "bitrate", bitrate);
			field_from_json(Obj, "mcs", mcs);
			field_from_json(Obj, "nss", nss);
			field_from_json(Obj, "ht", ht);
			field_from_json(Obj, "sgi", sgi);
			field_from_json(Obj, "chwidth", chwidth);
			return true;
		} catch (...) {
		}
		return false;
	}

	void UETimePoint::to_json(Poco::JSON::Object &Obj) const {
		field_to_json(Obj, "station", station);
		field_to_json(Obj, "rssi", rssi);
		field_to_json(Obj, "tx_bytes", tx_bytes);
		field_to_json(Obj, "rx_bytes", rx_bytes);
		field_to_json(Obj, "tx_duration", tx_duration);
		field_to_json(Obj, "rx_packets", rx_packets);
		field_to_json(Obj, "tx_packets", tx_packets);
		field_to_json(Obj, "tx_retries", tx_retries);
		field_to_json(Obj, "tx_failed", tx_failed);
		field_to_json(Obj, "connected", connected);
		field_to_json(Obj, "inactive", inactive);
		field_to_json(Obj, "tx_rate", tx_rate);
		field_to_json(Obj, "rx_rate", rx_rate);
		//      field_to_json(Obj, "tidstats", tidstats);

		field_to_json(Obj, "tx_bytes_bw", tx_bytes_bw);
		field_to_json(Obj, "rx_bytes_bw", rx_bytes_bw);
		field_to_json(Obj, "tx_packets_bw", tx_packets_bw);
		field_to_json(Obj, "rx_packets_bw", rx_packets_bw);
		field_to_json(Obj, "tx_failed_pct", tx_failed_pct);
		field_to_json(Obj, "tx_retries_pct", tx_retries_pct);
		field_to_json(Obj, "tx_duration_pct", tx_duration_pct);

		field_to_json(Obj, "tx_bytes_delta", tx_bytes_delta);
		field_to_json(Obj, "rx_bytes_delta", rx_bytes_delta);
		field_to_json(Obj, "tx_packets_delta", tx_packets_delta);
		field_to_json(Obj, "rx_packets_delta", rx_packets_delta);
		field_to_json(Obj, "tx_failed_delta", tx_failed_delta);
		field_to_json(Obj, "tx_retries_delta", tx_retries_delta);
		field_to_json(Obj, "tx_duration_delta", tx_duration_delta);
	}

	bool UETimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
		try {
			field_from_json(Obj, "station", station);
			field_from_json(Obj, "rssi", rssi);
			field_from_json(Obj, "tx_bytes", tx_bytes);
			field_from_json(Obj, "rx_bytes", rx_bytes);
			field_from_json(Obj, "tx_duration", tx_duration);
			field_from_json(Obj, "rx_packets", rx_packets);
			field_from_json(Obj, "tx_packets", tx_packets);
			field_from_json(Obj, "tx_retries", tx_retries);
			field_from_json(Obj, "tx_failed", tx_failed);
			field_from_json(Obj, "connected", connected);
			field_from_json(Obj, "inactive", inactive);
			field_from_json(Obj, "tx_rate", tx_rate);
			field_from_json(Obj, "rx_rate", rx_rate);
			//          field_from_json(Obj,"tidstats",tidstats);
			field_from_json(Obj, "tx_bytes_bw", tx_bytes_bw);
			field_from_json(Obj, "rx_bytes_bw", rx_bytes_bw);
			field_from_json(Obj, "tx_packets_bw", tx_packets_bw);
			field_from_json(Obj, "rx_packets_bw", rx_packets_bw);
			field_from_json(Obj, "tx_failed_pct", tx_failed_pct);
			field_from_json(Obj, "tx_retries_pct", tx_retries_pct);
			field_from_json(Obj, "tx_duration_pct", tx_duration_pct);
			field_from_json(Obj, "tx_bytes_delta", tx_bytes_delta);
			field_from_json(Obj, "rx_bytes_delta", rx_bytes_delta);
			field_from_json(Obj, "tx_packets_delta", tx_packets_delta);
			field_from_json(Obj, "rx_packets_delta", rx_packets_delta);
			field_from_json(Obj, "tx_failed_delta", tx_failed_delta);
			field_from_json(Obj, "tx_retries_delta", tx_retries_delta);
			field_from_json(Obj, "tx_duration_delta", tx_duration_delta);
			return true;
		} catch (...) {
		}
		return false;
	}

	void APTimePoint::to_json(Poco::JSON::Object &Obj) const {
		field_to_json(Obj, "collisions", collisions);
		field_to_json(Obj, "multicast", multicast);
		field_to_json(Obj, "rx_bytes", rx_bytes);
		field_to_json(Obj, "rx_dropped", rx_dropped);
		field_to_json(Obj, "rx_errors", rx_errors);
		field_to_json(Obj, "rx_packets", rx_packets);
		field_to_json(Obj, "tx_bytes", tx_bytes);
		field_to_json(Obj, "tx_packets", tx_packets);
		field_to_json(Obj, "tx_dropped", tx_dropped);
		field_to_json(Obj, "tx_errors", tx_errors);
		field_to_json(Obj, "tx_packets", tx_packets);

		field_to_json(Obj, "tx_bytes_bw", tx_bytes_bw);
		field_to_json(Obj, "rx_bytes_bw", rx_bytes_bw);
		field_to_json(Obj, "rx_dropped_pct", rx_dropped_pct);
		field_to_json(Obj, "tx_dropped_pct", tx_dropped_pct);
		field_to_json(Obj, "rx_packets_bw", rx_packets_bw);
		field_to_json(Obj, "tx_packets_bw", tx_packets_bw);
		field_to_json(Obj, "rx_errors_pct", rx_errors_pct);
		field_to_json(Obj, "tx_errors_pct", tx_errors_pct);

		field_to_json(Obj, "tx_bytes_delta", tx_bytes_delta);
		field_to_json(Obj, "rx_bytes_delta", rx_bytes_delta);
		field_to_json(Obj, "rx_dropped_delta", rx_dropped_delta);
		field_to_json(Obj, "tx_dropped_delta", tx_dropped_delta);
		field_to_json(Obj, "rx_packets_delta", rx_packets_delta);
		field_to_json(Obj, "tx_packets_delta", tx_packets_delta);
		field_to_json(Obj, "rx_errors_delta", rx_errors_delta);
		field_to_json(Obj, "tx_errors_delta", tx_errors_delta);
	}

	bool APTimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
		try {
			field_from_json(Obj, "collisions", collisions);
			field_from_json(Obj, "multicast", multicast);
			field_from_json(Obj, "rx_bytes", rx_bytes);
			field_from_json(Obj, "rx_dropped", rx_dropped);
			field_from_json(Obj, "rx_errors", rx_errors);
			field_from_json(Obj, "rx_packets", rx_packets);
			field_from_json(Obj, "tx_bytes", tx_bytes);
			field_from_json(Obj, "tx_packets", tx_packets);
			field_from_json(Obj, "tx_dropped", tx_dropped);
			field_from_json(Obj, "tx_errors", tx_errors);
			field_from_json(Obj, "tx_packets", tx_packets);

			field_from_json(Obj, "tx_bytes_bw", tx_bytes_bw);
			field_from_json(Obj, "rx_bytes_bw", rx_bytes_bw);
			field_from_json(Obj, "rx_dropped_pct", rx_dropped_pct);
			field_from_json(Obj, "tx_dropped_pct", tx_dropped_pct);
			field_from_json(Obj, "rx_packets_bw", rx_packets_bw);
			field_from_json(Obj, "tx_packets_bw", tx_packets_bw);
			field_from_json(Obj, "rx_errors_pct", rx_errors_pct);
			field_from_json(Obj, "tx_errors_pct", tx_errors_pct);

			field_from_json(Obj, "tx_bytes_delta", tx_bytes_delta);
			field_from_json(Obj, "rx_bytes_delta", rx_bytes_delta);
			field_from_json(Obj, "rx_dropped_delta", rx_dropped_delta);
			field_from_json(Obj, "tx_dropped_delta", tx_dropped_delta);
			field_from_json(Obj, "rx_packets_delta", rx_packets_delta);
			field_from_json(Obj, "tx_packets_delta", tx_packets_delta);
			field_from_json(Obj, "rx_errors_delta", rx_errors_delta);
			field_from_json(Obj, "tx_errors_delta", tx_errors_delta);

			return true;
		} catch (...) {
		}
		return false;
	}

	void TIDstat_entry::to_json(Poco::JSON::Object &Obj) const {
		field_to_json(Obj, "rx_msdu", rx_msdu);
		field_to_json(Obj, "tx_msdu", tx_msdu);
		field_to_json(Obj, "tx_msdu_failed", tx_msdu_failed);
		field_to_json(Obj, "tx_msdu_retries", tx_msdu_retries);
	}

	bool TIDstat_entry::from_json(const Poco::JSON::Object::Ptr &Obj) {
		try {
			field_from_json(Obj, "rx_msdu", rx_msdu);
			field_from_json(Obj, "tx_msdu", tx_msdu);
			field_from_json(Obj, "tx_msdu_failed", tx_msdu_failed);
			field_from_json(Obj, "tx_msdu_retries", tx_msdu_retries);
			return true;
		} catch (...) {
		}
		return false;
	}

	void RadioTimePoint::to_json(Poco::JSON::Object &Obj) const {
		field_to_json(Obj, "band", band);
		field_to_json(Obj, "channel_width", channel_width);
		field_to_json(Obj, "active_ms", active_ms);
		field_to_json(Obj, "busy_ms", busy_ms);
		field_to_json(Obj, "receive_ms", receive_ms);
		field_to_json(Obj, "transmit_ms", transmit_ms);
		field_to_json(Obj, "tx_power", tx_power);
		field_to_json(Obj, "channel", channel);
		field_to_json(Obj, "temperature", temperature);
		field_to_json(Obj, "noise", noise);
		field_to_json(Obj, "active_pct", active_pct);
		field_to_json(Obj, "busy_pct", busy_pct);
		field_to_json(Obj, "receive_pct", receive_pct);
		field_to_json(Obj, "transmit_pct", transmit_pct);
	}

	bool RadioTimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
		try {
			field_from_json(Obj, "band", band);
			field_from_json(Obj, "channel_width", channel_width);
			field_from_json(Obj, "active_ms", active_ms);
			field_from_json(Obj, "busy_ms", busy_ms);
			field_from_json(Obj, "receive_ms", receive_ms);
			field_from_json(Obj, "transmit_ms", transmit_ms);
			field_from_json(Obj, "tx_power", tx_power);
			field_from_json(Obj, "channel", channel);
			field_from_json(Obj, "temperature", temperature);
			field_from_json(Obj, "noise", noise);
			field_from_json(Obj, "active_pct", active_pct);
			field_from_json(Obj, "busy_pct", busy_pct);
			field_from_json(Obj, "receive_pct", receive_pct);
			field_from_json(Obj, "transmit_pct", transmit_pct);
			return true;
		} catch (...) {
		}
		return false;
	}

	void AveragePoint::to_json(Poco::JSON::Object &Obj) const {
		field_to_json(Obj, "min", min);
		field_to_json(Obj, "max", max);
		field_to_json(Obj, "avg", avg);
	}

	bool AveragePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
		try {
			field_from_json(Obj, "min", min);
			field_from_json(Obj, "max", max);
			field_from_json(Obj, "avg", avg);
			return true;
		} catch (...) {
		}
		return false;
	}

	void SSIDTimePoint::to_json(Poco::JSON::Object &Obj) const {
		field_to_json(Obj, "bssid", bssid);
		field_to_json(Obj, "mode", mode);
		field_to_json(Obj, "ssid", ssid);
		field_to_json(Obj, "band", band);
		field_to_json(Obj, "channel", channel);
		field_to_json(Obj, "associations", associations);
		field_to_json(Obj, "tx_bytes_bw", tx_bytes_bw);
		field_to_json(Obj, "rx_bytes_bw", rx_bytes_bw);
		field_to_json(Obj, "tx_packets_bw", tx_packets_bw);
		field_to_json(Obj, "rx_packets_bw", rx_packets_bw);
		field_to_json(Obj, "tx_failed_pct", tx_failed_pct);
		field_to_json(Obj, "tx_retries_pct", tx_retries_pct);
		field_to_json(Obj, "tx_duration_pct", tx_duration_pct);
	}

	bool SSIDTimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
		try {
			field_from_json(Obj, "bssid", bssid);
			field_from_json(Obj, "mode", mode);
			field_from_json(Obj, "ssid", ssid);
			field_from_json(Obj, "band", band);
			field_from_json(Obj, "channel", channel);
			field_from_json(Obj, "associations", associations);
			field_from_json(Obj, "tx_bytes_bw", tx_bytes_bw);
			field_from_json(Obj, "rx_bytes_bw", rx_bytes_bw);
			field_from_json(Obj, "tx_packets_bw", tx_packets_bw);
			field_from_json(Obj, "rx_packets_bw", rx_packets_bw);
			field_from_json(Obj, "tx_failed_pct", tx_failed_pct);
			field_from_json(Obj, "tx_retries_pct", tx_retries_pct);
			field_from_json(Obj, "tx_duration_pct", tx_duration_pct);
			return true;
		} catch (...) {
		}
		return false;
	}

	void DeviceTimePoint::to_json(Poco::JSON::Object &Obj) const {
		field_to_json(Obj, "id", id);
		field_to_json(Obj, "boardId", boardId);
		field_to_json(Obj, "timestamp", timestamp);
		field_to_json(Obj, "ap_data", ap_data);
		field_to_json(Obj, "ssid_data", ssid_data);
		field_to_json(Obj, "radio_data", radio_data);
		field_to_json(Obj, "device_info", device_info);
		field_to_json(Obj, "serialNumber", serialNumber);
	}

	bool DeviceTimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
		try {
			field_from_json(Obj, "id", id);
			field_from_json(Obj, "boardId", boardId);
			field_from_json(Obj, "timestamp", timestamp);
			field_from_json(Obj, "ap_data", ap_data);
			field_from_json(Obj, "ssid_data", ssid_data);
			field_from_json(Obj, "radio_data", radio_data);
			field_from_json(Obj, "device_info", device_info);
			field_from_json(Obj, "serialNumber", serialNumber);
			return true;
		} catch (...) {
		}
		return false;
	}

	void DeviceTimePointAnalysis::to_json(Poco::JSON::Object &Obj) const {
		field_to_json(Obj, "noise", noise);
		field_to_json(Obj, "temperature", temperature);
		field_to_json(Obj, "active_pct", active_pct);
		field_to_json(Obj, "busy_pct", busy_pct);
		field_to_json(Obj, "receive_pct", receive_pct);
		field_to_json(Obj, "transmit_pct", transmit_pct);
		field_to_json(Obj, "tx_power", tx_power);
		field_to_json(Obj, "tx_bytes_bw", tx_bytes_bw);
		field_to_json(Obj, "rx_bytes_bw", rx_bytes_bw);
		field_to_json(Obj, "rx_dropped_pct", rx_dropped_pct);
		field_to_json(Obj, "tx_dropped_pct", tx_dropped_pct);
		field_to_json(Obj, "rx_packets_bw", rx_packets_bw);
		field_to_json(Obj, "tx_packets_bw", tx_packets_bw);
		field_to_json(Obj, "rx_errors_pct", rx_errors_pct);
		field_to_json(Obj, "tx_errors_pct", tx_errors_pct);
	}

	bool DeviceTimePointAnalysis::from_json(const Poco::JSON::Object::Ptr &Obj) {
		try {
			field_from_json(Obj, "noise", noise);
			field_from_json(Obj, "temperature", temperature);
			field_from_json(Obj, "active_pct", active_pct);
			field_from_json(Obj, "busy_pct", busy_pct);
			field_from_json(Obj, "receive_pct", receive_pct);
			field_from_json(Obj, "transmit_pct", transmit_pct);
			field_from_json(Obj, "tx_power", tx_power);
			field_from_json(Obj, "tx_bytes_bw", tx_bytes_bw);
			field_from_json(Obj, "rx_bytes_bw", rx_bytes_bw);
			field_from_json(Obj, "rx_dropped_pct", rx_dropped_pct);
			field_from_json(Obj, "tx_dropped_pct", tx_dropped_pct);
			field_from_json(Obj, "rx_packets_bw", rx_packets_bw);
			field_from_json(Obj, "tx_packets_bw", tx_packets_bw);
			field_from_json(Obj, "rx_errors_pct", rx_errors_pct);
			field_from_json(Obj, "tx_errors_pct", tx_errors_pct);
			return true;
		} catch (...) {
		}
		return false;
	}

	void DeviceTimePointList::to_json(Poco::JSON::Object &Obj) const {
		field_to_json(Obj, "points", points);
		field_to_json(Obj, "stats", stats);
	}

	bool DeviceTimePointList::from_json(const Poco::JSON::Object::Ptr &Obj) {
		try {
			field_from_json(Obj, "points", points);
			field_from_json(Obj, "stats", stats);
			return true;
		} catch (...) {
		}
		return false;
	}

	void DeviceTimePointStats::to_json(Poco::JSON::Object &Obj) const {
		field_to_json(Obj, "firstPoint", firstPoint);
		field_to_json(Obj, "lastPoint", lastPoint);
		field_to_json(Obj, "count", count);
	}

	bool DeviceTimePointStats::from_json(const Poco::JSON::Object::Ptr &Obj) {
		try {
			field_from_json(Obj, "firstPoint", firstPoint);
			field_from_json(Obj, "lastPoint", lastPoint);
			field_from_json(Obj, "count", count);
			return true;
		} catch (...) {
		}
		return false;
	}

	void WifiClientRate::to_json(Poco::JSON::Object &Obj) const {
		field_to_json(Obj, "bitrate", bitrate);
		field_to_json(Obj, "chwidth", chwidth);
		field_to_json(Obj, "mcs", mcs);
		field_to_json(Obj, "nss", nss);
		field_to_json(Obj, "vht", vht);
	}

	bool WifiClientRate::from_json(const Poco::JSON::Object::Ptr &Obj) {
		try {
			field_from_json(Obj, "bitrate", bitrate);
			field_from_json(Obj, "chwidth", chwidth);
			field_from_json(Obj, "mcs", mcs);
			field_from_json(Obj, "nss", nss);
			field_from_json(Obj, "vht", vht);
			return true;
		} catch (...) {
		}
		return false;
	}

	void WifiClientHistory::to_json(Poco::JSON::Object &Obj) const {
		field_to_json(Obj, "timestamp", timestamp);
		field_to_json(Obj, "station_id", station_id);
		field_to_json(Obj, "bssid", bssid);
		field_to_json(Obj, "ssid", ssid);
		field_to_json(Obj, "rssi", rssi);
		field_to_json(Obj, "rx_bitrate", rx_bitrate);
		field_to_json(Obj, "rx_chwidth", rx_chwidth);
		field_to_json(Obj, "rx_mcs", rx_mcs);
		field_to_json(Obj, "rx_nss", rx_nss);
		field_to_json(Obj, "rx_vht", rx_vht);
		field_to_json(Obj, "tx_bitrate", tx_bitrate);
		field_to_json(Obj, "tx_chwidth", tx_chwidth);
		field_to_json(Obj, "tx_mcs", tx_mcs);
		field_to_json(Obj, "tx_nss", tx_nss);
		field_to_json(Obj, "tx_vht", tx_vht);
		field_to_json(Obj, "rx_bytes", rx_bytes);
		field_to_json(Obj, "tx_bytes", tx_bytes);
		field_to_json(Obj, "rx_duration", rx_duration);
		field_to_json(Obj, "tx_duration", tx_duration);
		field_to_json(Obj, "rx_packets", rx_packets);
		field_to_json(Obj, "tx_packets", tx_packets);
		field_to_json(Obj, "ipv4", ipv4);
		field_to_json(Obj, "ipv6", ipv6);
		field_to_json(Obj, "channel_width", channel_width);
		field_to_json(Obj, "noise", noise);
		field_to_json(Obj, "tx_power", tx_power);
		field_to_json(Obj, "channel", channel);
		field_to_json(Obj, "active_ms", active_ms);
		field_to_json(Obj, "busy_ms", busy_ms);
		field_to_json(Obj, "receive_ms", receive_ms);
		field_to_json(Obj, "mode", mode);
		field_to_json(Obj, "ack_signal", ack_signal);
		field_to_json(Obj, "ack_signal_avg", ack_signal_avg);
		field_to_json(Obj, "connected", connected);
		field_to_json(Obj, "inactive", inactive);
		field_to_json(Obj, "tx_retries", tx_retries);
		field_to_json(Obj, "venue_id", venue_id);
	}

	bool WifiClientHistory::from_json(const Poco::JSON::Object::Ptr &Obj) {
		try {
			field_from_json(Obj, "timestamp", timestamp);
			field_from_json(Obj, "station_id", station_id);
			field_from_json(Obj, "bssid", bssid);
			field_from_json(Obj, "ssid", ssid);
			field_from_json(Obj, "rssi", rssi);
			field_from_json(Obj, "rx_bitrate", rx_bitrate);
			field_from_json(Obj, "rx_chwidth", rx_chwidth);
			field_from_json(Obj, "rx_mcs", rx_mcs);
			field_from_json(Obj, "rx_nss", rx_nss);
			field_from_json(Obj, "rx_vht", rx_vht);
			field_from_json(Obj, "tx_bitrate", tx_bitrate);
			field_from_json(Obj, "tx_chwidth", tx_chwidth);
			field_from_json(Obj, "tx_mcs", tx_mcs);
			field_from_json(Obj, "tx_nss", tx_nss);
			field_from_json(Obj, "tx_vht", tx_vht);
			field_from_json(Obj, "rx_bytes", rx_bytes);
			field_from_json(Obj, "tx_bytes", tx_bytes);
			field_from_json(Obj, "rx_duration", rx_duration);
			field_from_json(Obj, "tx_duration", tx_duration);
			field_from_json(Obj, "rx_packets", rx_packets);
			field_from_json(Obj, "tx_packets", tx_packets);
			field_from_json(Obj, "ipv4", ipv4);
			field_from_json(Obj, "ipv6", ipv6);
			field_from_json(Obj, "channel_width", channel_width);
			field_from_json(Obj, "noise", noise);
			field_from_json(Obj, "tx_power", tx_power);
			field_from_json(Obj, "channel", channel);
			field_from_json(Obj, "active_ms", active_ms);
			field_from_json(Obj, "busy_ms", busy_ms);
			field_from_json(Obj, "receive_ms", receive_ms);
			field_from_json(Obj, "mode", mode);
			field_from_json(Obj, "ack_signal", ack_signal);
			field_from_json(Obj, "ack_signal_avg", ack_signal_avg);
			field_from_json(Obj, "connected", connected);
			field_from_json(Obj, "inactive", inactive);
			field_from_json(Obj, "tx_retries", tx_retries);
			field_from_json(Obj, "venue_id", venue_id);
			return true;
		} catch (...) {
		}
		return false;
	}
} // namespace OpenWifi::AnalyticsObjects