/**
 *
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <fstream>
#include <map>
#include <memory>
#include <utility>
#include <string>
#include <set>
#include "TestBase.h"
#include "core/Core.h"
#include "wel/MetadataWalker.h"
#include "wel/XMLString.h"
#include "pugixml.hpp"

using namespace org::apache::nifi::minifi::wel;


static std::string formatXml(const std::string &xml) {
	pugi::xml_document doc;
	pugi::xml_parse_result result = doc.load_string(xml.c_str());

	if (result) {
		XmlString writer;
		doc.print(writer, "", pugi::format_raw); // no indentation or formatting
		return writer.xml_;
	}
	return xml;
}

TEST_CASE("TestResolutions", "[Resolutions]") {
	std::ifstream file("resources/nobodysid.xml");
	std::string xml((std::istreambuf_iterator<char>(file)),
		std::istreambuf_iterator<char>());
	
	SECTION("No resolution") {
		REQUIRE(MetadataWalker::updateXmlMetadata(xml, 0x00, 0x00, false, true) == formatXml(xml));
	}

	SECTION("Resolve nobody") {
		std::ifstream resolvedfile("resources/withsids.xml");
		std::string nobody((std::istreambuf_iterator<char>(resolvedfile)),
			std::istreambuf_iterator<char>());
		REQUIRE(MetadataWalker::updateXmlMetadata(xml, 0x00, 0x00, true, true, ".*Sid") == formatXml(nobody));
	}

}

TEST_CASE("TestNoData", "[NoDataBlock]") {
	std::ifstream resolvedfile("resources/nodata.xml");
	std::string xml((std::istreambuf_iterator<char>(resolvedfile)),
		std::istreambuf_iterator<char>());


	REQUIRE(MetadataWalker::updateXmlMetadata(xml, 0x00, 0x00, false, true) == formatXml(xml));
	

}

TEST_CASE("TestInvalidXml", "[InvalidSet]") {
	std::ifstream resolvedfile("resources/invalidxml.xml");
	std::string xml((std::istreambuf_iterator<char>(resolvedfile)),
		std::istreambuf_iterator<char>());


	REQUIRE_THROWS(MetadataWalker::updateXmlMetadata(xml, 0x00, 0x00, false, true) == formatXml(xml));


}

TEST_CASE("TestUnknownSid", "[InvalidSet]") {
	std::ifstream resolvedfile("resources/unknownsid.xml");
	std::string xml((std::istreambuf_iterator<char>(resolvedfile)),
		std::istreambuf_iterator<char>());


	REQUIRE(MetadataWalker::updateXmlMetadata(xml, 0x00, 0x00, false, true) == formatXml(xml));


}



TEST_CASE("TestMultipleSids", "[Resolutions]") {
	std::ifstream unresolvedfile("resources/multiplesids.xml");
	std::string xml((std::istreambuf_iterator<char>(unresolvedfile)),
		std::istreambuf_iterator<char>());

	std::string programmaticallyResolved;

	pugi::xml_document doc;
	xml = MetadataWalker::updateXmlMetadata(xml, 0x00, 0x00, false, true);
	pugi::xml_parse_result result = doc.load_string(xml.c_str());

	for (const auto &node : doc.child("Event").child("EventData").children())
	{
		auto name = node.attribute("Name").as_string();
		if (utils::StringUtils::equalsIgnoreCase("GroupMembership",name)) {
			programmaticallyResolved = node.text().get();
			break;
		}
	}

	std::string expected = "Nobody Everyone Null Authority";

	// we are only testing mulitiple sid resolutions, not the resolution of other items. 
	REQUIRE(expected == programmaticallyResolved);


}
