// Copyrigth Xtooltech @ 2023- All rights reserved.(LXH)

#include "StationDataBlock.hpp"
#include "cJSON.h"

namespace otx {
	namespace jidu {

		StationDataBlock::StationDataBlock() {
			this->mState = "OK";//只要有一个item失败就会被设置为NOK。
		}
		StationDataBlock::~StationDataBlock() {
			int size = this->mTestItemList.size();
			for (int i = 0; i < size; i++) {
				StationDataItem* item = this->mTestItemList[i];
				delete item;
			}
			this->mTestItemList.clear();
		}

		std::string StationDataBlock::getTestStatisticName() { return this->mTestStatisticName; }
		void StationDataBlock::setTestStatisticName(const std::string& v) { this->mTestStatisticName = v; }

		std::string StationDataBlock::getTestStatisticId() { return this->mTestStatisticId; }
		void StationDataBlock::setTestStatisticId(const std::string& v) { this->mTestStatisticId = v; }

		std::string StationDataBlock::getTestBlockName() { return this->mTestBlockName; }
		void StationDataBlock::setTestBlockName(const std::string& v) { this->mTestBlockName = v; }

		std::string StationDataBlock::getTestBlockId() { return this->mTestBlockId; }
		void StationDataBlock::setTestBlockId(const std::string& v) { this->mTestBlockId = v; }

		std::string StationDataBlock::getTestBlockResult() { return this->mTestBlockResult; }
		void StationDataBlock::setTestBlockResult(const std::string& v) { this->mTestBlockResult = v; }

		std::vector<std::string>* StationDataBlock::getFailReason() { return &this->mFailReason; }
		void StationDataBlock::addFailReason(const std::string& v) { this->mFailReason.push_back(v); }

		std::vector<StationDataItem*>* StationDataBlock::getTestItemList() { return &this->mTestItemList; }
		StationDataItem* StationDataBlock::newTestItem() {
			StationDataItem* result = new StationDataItem();
			this->mTestItemList.push_back(result);
			return result;
		}
		StationDataItem* StationDataBlock::getTestItemById(const std::string& v) {
			StationDataItem* result = nullptr;
			int size = this->mTestItemList.size();
			for (int i = 0; i < size; i++) {
				StationDataItem* item = this->mTestItemList[i];
				if (item->getTestItemId() == v) {
					result = item;
					break;
				}
			}
			return result;
		}
		StationDataItem* StationDataBlock::getTestItemByName(const std::string& v) {
			StationDataItem* result = nullptr;
			int size = this->mTestItemList.size();
			for (int i = 0; i < size; i++) {
				StationDataItem* item = this->mTestItemList[i];
				if (item->getTestItemName() == v) {
					result = item;
					break;
				}
			}
			return result;
		}

		std::string StationDataBlock::toJsonString() {
			std::string result;


			cJSON* obj = cJSON_CreateObject();

			if (this->mTestStatisticName.size() > 0) {
				cJSON_AddStringToObject(obj, "testStatisticName", this->mTestStatisticName.c_str());
			}

			if (this->mTestStatisticId.size() > 0) {
				cJSON_AddStringToObject(obj, "testStatisticId", this->mTestStatisticId.c_str());
			}

			if (this->mTestBlockName.size() > 0) {
				cJSON_AddStringToObject(obj, "testBlockName", this->mTestBlockName.c_str());
			}

			if (this->mTestBlockId.size() > 0) {
				cJSON_AddStringToObject(obj, "testBlockId", this->mTestBlockId.c_str());
			}

			if (this->mTestBlockResult.size() > 0) {
				cJSON_AddStringToObject(obj, "testBlockResult", this->mTestBlockResult.c_str());
			}

			int size = this->mFailReason.size();
			if (size > 0) {
				cJSON* arrObj = cJSON_CreateArray();
				for (int i = 0; i < size; i++) {
					cJSON_AddItemToArray(arrObj, cJSON_CreateString(this->mFailReason[i].c_str()));
				}

				cJSON_AddItemToObject(obj, "failReason", arrObj);
			}

			size = this->mTestItemList.size();
			if (size > 0) {
				cJSON* arrObj = cJSON_CreateArray();
				for (int i = 0; i < size; i++) {
					cJSON* tempItem = cJSON_Parse(this->mTestItemList[i]->toJsonString().c_str());
					if(cJSON_HasObjectItem(tempItem, "testItem"))
						cJSON_AddItemToArray(arrObj, tempItem);
					else {
						cJSON_Delete(tempItem);
					}
				}

				cJSON_AddItemToObject(obj, "testItemList", arrObj);
			}

			char* tepm = cJSON_PrintUnformatted(obj);
			cJSON_Delete(obj);
			result = tepm;
			cJSON_free(tepm);
			return result;
		}

		std::string StationDataBlock::getBeginTime() { return this->mBeginTime; }
		void StationDataBlock::setBeginTime(const std::string& v) { this->mBeginTime = v; }

		std::string StationDataBlock::getEndTime() { return this->mEndTime; }
		void StationDataBlock::setEndTime(const std::string& v) { this->mEndTime = v; }

		std::string StationDataBlock::getState() { return this->mState; }
		void StationDataBlock::updateState() {
			int size = this->mTestItemList.size();
			for (int i = 0; i < size; i++) {
				StationDataItem* item = this->mTestItemList[i];
				std::string itemResult = item->getTestItemResult();
				if (itemResult == "NOK") {
					this->mState = "NOK";
					break;
				}
			}

			this->mTestBlockResult = this->mState;
		}

		StationDataCategory* StationDataBlock::getCategory() {
			return this->mCategory;
		}
		void StationDataBlock::setCategory(StationDataCategory* v) {
			this->mCategory = v;
		}
	} // namespace jidu
} // namespace otx
