#ifndef CSV_H
#define CSV_H


class CSV {

	int row = 0;
	const char sep = ';';
	std::stringstream ss;

public:

	void add(const OptStats& stats, const Floorplan::Ceilings& ceilings) {

		ss << ++row << sep;
		ss << stats.mac.asString() << sep;
		ss << (stats.knownToMap() ? 1 : 0) << sep;

		ss << stats.getEstErrorAvg() << sep;
		ss << stats.getEstErrorMaxNeg().getError_db() << sep;
		ss << stats.getEstErrorMaxPos().getError_db() << sep;

		ss << stats.getEstPos().x << sep;
		ss << stats.getEstPos().y << sep;
		ss << stats.getEstPos().z << sep;

		if (stats.knownToMap()) {
			ss << stats.realPos.x << sep;
			ss << stats.realPos.y << sep;
			ss << stats.realPos.z << sep;
			ss << stats.getRealEstDiff().length() << sep;
			ss << ceilings.numCeilingsBetween(stats.realPos, stats.getEstPos()) << sep;
			ss << stats.name << sep;
		}

		ss << "\n";

	}

	/** an AP that is known to the map, but unseen during fingerprinting [should not happen] */
	void addUnseen(const MACAddress& mac) {
		ss << ++row << sep;
		ss << mac.asString() << sep;
		ss << "AP_IN_MAP_BUT_UNSEEN_DURING_FINGERPRINTING" << sep;
		ss << "\n";
	}

	/** ap is seen, but there are not enough fingerprints [should not happen] */
	void addNotEnoughFingerprints(const OptStats& stats) {
		ss << ++row << sep;
		ss << stats.mac.asString() << sep;
		ss << "NOT_ENOUGH_FINGERPRINTS" << sep;
	}

	void dump() {
		std::cout << ss.str() << std::endl;
	}



};


#endif // CSV_H
