#!/usr/bin/php
<?

$progname = basename($argv[0]);
$stderr = fopen("php://stderr", "w");

function report_error($msg) {

	global $stderr;
	global $progname;

	fprintf($stderr, "$progname: $msg\n");

	return;

} // end report_error()

function create_group_node($arr, $xml_doc, &$users) {

	global $exclude_ids;
	global $license_translations;
	global $maturity_translations;
	global $keyword_translations;
	global $topic_translations;
	global $member_roles;
	global $groups_by_incf_id;

	if (!check_model_array($arr, "software.project", "create_group_node()")) {
		return NULL;
	}

	print "reading INCF ID " . $arr["pk"] . "\n";

	if (in_array($arr["pk"], $exclude_ids)) {
		print "excluding ID " . $arr["pk"] . "\n";
		return false;
	}

	if (!in_array($arr["pk"], $groups_by_incf_id)) {
		print "error\n";
		report_error("no group for INCF ID " . $arr["pk"]);
		return false;
	}

	$errors = array();

	$group_node = $xml_doc->createElement("group");
	$group_node->setAttribute("source_id", $arr["pk"]);

	$project_slug = NULL;

	$trove_cats = array();

	foreach ($arr["fields"] as $key => $value) {

		if ($key == "prerequirements") {
			// ignore
		} elseif ($key == "documentation" && count($value) > 0) {
			$dg_node = $xml_doc->createElement("doc_group");
			$dg_node->setAttribute("source_id", "p" . $arr["pk"] . "documentation");
			$dg_node->appendChild($xml_doc->createElement("name", "Documentation"));
			foreach ($value as $doc) {
				$doc_node = read_document($doc, $xml_doc, $arr["pk"]);
				if (is_null($doc_node)) {
					return NULL;
				}
				$dg_node->appendChild($doc_node);
			}
			$group_node->appendChild($dg_node);
		} elseif ($key == "name") {
			$name_node = $xml_doc->createElement("name", $value);
			$group_node->appendChild($name_node);
		} elseif ($key == "license") {
			if (!array_key_exists($value, $license_translations)) {
				$errors[] = "unmapped license \"$value\"";
			} elseif (!is_null($license_translations[$value])) {
				$trove_cats[] = $license_translations[$value];
			}
		} elseif ($key == "maturity") {
			if ($value != "") {
				if (!array_key_exists($value, $maturity_translations)) {
					$errors[] = "unmapped maturity \"$value\"";
				} elseif (!is_null($maturity_translations[$value])) {
					$trove_cats[] = $maturity_translations[$value];
				}
			}
		} elseif ($key == "url") {
			$url = $value;
		} elseif ($key == "topics") {
			foreach ($value as $topic) {
				if (!array_key_exists($topic, $topic_translations)) {
					$errors[] = "unmapped topic \"$topic\"";
				} elseif (!is_null($topic_translations[$topic])) {
					$trove_cats[] = $topic_translations[$topic];
				}
			}
		} elseif ($key == "last_modified_date") {
			// ignore
		} elseif ($key == "images") {
			foreach ($value as $image) {
				$screenshot_node = read_image($image, $xml_doc, $arr["pk"]);
				if (is_null($screenshot_node)) {
					return NULL;
				}
				$group_node->appendChild($screenshot_node);
			}
		} elseif ($key == "creation_date") {
			// ignore
		} elseif ($key == "ease_of_use") {
			// ignore
		} elseif ($key == "citations" && count($value) > 0) {
			$dg_node = $xml_doc->createElement("doc_group");
			$dg_node->setAttribute("source_id", "p" . $arr["pk"] . "citations");
			$dg_node->appendChild($xml_doc->createElement("name", "Citations"));
			foreach ($value as $doc) {
				$doc_node = read_citation($doc, $xml_doc, $arr["pk"]);
				if (is_null($doc_node)) {
					return NULL;
				}
				$dg_node->appendChild($doc_node);
			}
			$group_node->appendChild($dg_node);
		} elseif ($key == "purpose") {
			$description_node = $xml_doc->createElement("description", $value);
			$group_node->appendChild($description_node);
		} elseif ($key == "members") {
			$members = read_members($value, $arr["pk"]);
			if (is_null($members)) {
				return NULL;
			}
			if (!array_key_exists($arr["pk"], $member_roles)) {
				$errors[] = "can't find member role for project " . $arr["pk"];
			} else {
				foreach ($members as $source_id => $fullname) {
					$users[$source_id] = $fullname;
					$user_node = $xml_doc->createElement("user");
					$user_node->setAttribute("role_id", $member_roles[$arr["pk"]]);
					$user_node->setAttribute("source_id", $source_id);
					$group_node->appendChild($user_node);
				}
			}
		} elseif ($key == "keywords") {
			foreach ($value as $keyword) {
				if (!array_key_exists($keyword, $keyword_translations)) {
					$errors[] = "unmapped keyword \"$keyword\"";
				} elseif (!is_null($keyword_translations[$keyword])) {
					$trove_cats[] = $keyword_translations[$keyword];
				}
			}
		} elseif ($key == "downloads") {
			$package_node = $xml_doc->createElement("package");
			$package_node->setAttribute("source_id", "p" . $arr["pk"] . "package");
			$package_node->appendChild($xml_doc->createElement("name", "Releases"));
			foreach ($value as $download) {
				$release_node = read_release($download, $xml_doc, $arr["pk"]);
				if (is_null($release_node)) {
					return NULL;
				}
				$package_node->appendChild($release_node);
			}
			$group_node->appendChild($package_node);
		} elseif ($key == "description") {
			// ignore
		} elseif ($key == "slug") {
			$project_slug = $value;
		}

	}

	if (is_null($project_slug)) {
		$errors[] = "no slug given";
	}

	$source_url = "http://software.incf.org/software/$project_slug/home";
	$group_node->appendChild($xml_doc->createElement("source_url", $source_url));

	if (strlen($url) == 0) {
		$url = $source_url;
	}
	$url_node = $xml_doc->createElement("url", $url);
	$group_node->appendChild($url_node);

	if (count($errors) > 0) {
		print "error\n";
		foreach ($errors as $error) {
			report_error($arr["pk"] . ": $error");
		}
		return false;
	}

	foreach ($trove_cats as $trove_cat) {
		$trove_node = $xml_doc->createElement("trove");
		$trove_node->setAttribute("id", $trove_cat);
		$group_node->appendChild($trove_node);
	}

	return $group_node;

} // end create_group_node()

$exclude_data = file_get_contents("/var/lib/gforge/uploads/coord/coord/INCF-gtNITRCConfiguration/excludes.incf_nitrc");
if ($exclude_data === false) {
	print "error\n";
	report_error("error reading excludes file");
	exit(1);
}
$exclues = array();
foreach (preg_split("/\n/", $exclude_data) as $line) {
	if (strlen(trim($line)) == 0) {
		continue;
	}
	$parts = preg_split("/\s+/", trim($line), 2);
	$excludes[intval($parts[0])] = $parts[1];
}

if (true) {
	$data = file_get_contents("http://software.incf.org/json/");
} else {
	$data = file_get_contents("incf.json");
}
if ($data === false) {
	print "error\n";
	report_error("error reading incf.json");
	exit(1);
}

$arr = json_decode($data, true);
if ($arr === false) {
	print "error\n";
	report_error("error reading JSON");
	exit(1);
}
if (!is_array($arr)) {
	print "error\n";
	report_error("unexpected data in JSON");
	exit(1);
}

foreach ($arr as $project) {
	$pk = $project["pk"];
	$slug = '';
	$name = '';
	foreach ($project["fields"] as $key => $value) {
		if ($key == "slug") {
			$slug = $value;
		}
		if ($key == "name") {
			$name = $value;
		}
	}
	printf("%3d %s: %s\n", $pk, $slug, $name);
	if (array_key_exists($pk, $excludes)) {
		printf("    excluded: %s\n", $excludes[$pk]);
	}
}

exit(0);

?>
