<?php
/*******************************************************************************
 * Copyright (c) 2012 Eclipse Foundation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*    Wayne Beaton (Eclipse Foundation)- initial API and implementation
*******************************************************************************/

/*
 * Export the release information for a single project, specified
* via the "id" parameter.
*
* e.g. http://www.eclipse.org/projects/export/releases.json.php?id=technology.woolsey
*
* INTERNAL USE ONLY: restricted to callers within the Eclipse Foundation.
*/
require_once(dirname(__FILE__) . "/../../eclipse.org-common/system/app.class.php");
$App = new App();

require_once(dirname(__FILE__) . "/../classes/Committer.class.php");
require_once(dirname(__FILE__) . "/../classes/common.php");
require_once(dirname(__FILE__) . "/../classes/debug.php");

mustBeEclipseFoundationCaller();

$people = array();
foreach (getCommitters() as $committer) {
	if ($id = utf8_encode($committer->id)) {
		if ($id == 'glyn') continue; // TODO Need better solution to prune bogus entries.
		$people[$id]['first'] = utf8_encode($committer->firstName);
		$people[$id]['last'] = utf8_encode($committer->lastName);
		$people[$id]['email'] = utf8_encode($committer->email);
		if ($organization = $committer->getOrganization())
			$people[$id]['company'] = $organization->getSugarId();
		
		foreach($committer->projectRelations as $role) {
			$people[$id]['projects'][] = array(
				'project' => $role->projectId,
				'relation' => $role->relation,
				'active' => date('Y-m-d', $role->activeDate),
				'inactive' => $role->inactiveDate ? date('Y-m-d', $role->inactiveDate) : NULL
			);
		}
		
		foreach($committer->getAltEmails() as $email) {
			$people[$id]['alt-emails'][] = $email;
		}
		
		$people[$id]['addresses'] = $committer->getAllAddresses();
	}
}

$sql = "SELECT
			p.PersonId as id,
			pd.DocumentId as docId, pd.Version as docVersion, pd.Comments as comments,
				pd.EffectiveDate as docEffectiveDate, pd.ExpirationDate as docExpiryDate, 
				pd.ScannedDocumentBytes as docBytes,
			sd.Type as type, sd.Description as description
		FROM People as p
			LEFT JOIN PeopleDocuments as pd on p.PersonId=pd.PersonId 
			JOIN SYS_Documents as sd on pd.DocumentId = sd.DocumentId";
$result = $App->foundation_sql($sql);

while ($row=mysql_fetch_assoc($result)) {
	$people[utf8_encode($row['id'])]['documents'][$row['docId']] = array(
		'id' => $row['docId'],
		'type' => $row['type'],
		'description' => $row['description'],
		'effective' => normalizeDate($row['docEffectiveDate']),
		'expiry' => normalizeDate($row['docExpiryDate']),
		'comments' => utf8_encode($row['comments']),
		'url' => getDocUrl($row)
	);
}

$sql = "SELECT 
			p.PersonId as id, r.Relation as relation, r.EntryDate as date
		FROM People as p 
			JOIN PeopleRelations as r on (p.PersonId = r.PersonId)";

$result = $App->foundation_sql($sql);

while ($row=mysql_fetch_assoc($result)) {
	$people[utf8_encode($row['id'])]['projects'][] = array(
		'project' => null,
		'relation' => $row['relation'],
		'active' => $row['date'],
		'inactive' => NULL
	);
}

function normalizeDate($date) {
	if (!$date) return null;
	if ($date == '0000-00-00') return null;
	return date('Y-m-d', strtotime($date));
}

function getDocUrl($document) {
	if (!$document['docBytes']) return null;
	$personId = $document['id'];
	$docId = $document['docId'];
	$version = $document['docVersion'];
	return "https://foundation.eclipse.org/sys/show_document.php?type=I&PersonID=$personId&DocumentID=$docId&Version=$version";
}

$count = $_GET['count'];
if (isset($count)) {
	$people = array_slice($people, 0, $count);
}


echo json_encode($people);
?>