<?php
/*******************************************************************************
 * Copyright (c) 2013 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
*******************************************************************************/

require_once(dirname(__FILE__) . "/../../eclipse.org-common/system/app.class.php");
$App = new App();

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

mustBeEclipseFoundationCaller();

$output = array();

// FIXME Use the Forge class.
$forges = array();

// We build up a "where" clause bit-by-bit. The $and variable is an array
// that will contain all of the conjunctive conditions. Based on various
// bits of state, we will accumulate some number (more than one) of conjunctive
// conditions that we join together to build the "where" clause.
$and = array();

// If a forge is specified, narrow our search parameters to include only
// projects in that forge. If no forge is provided, assume that we're
// working in the "eclipse" forge.
if (in_array($forge = @$_GET['forge'], $forges)) {
	$and[] = "(pp.ProjectId like '$forge.%')";
	// Create a replacement string to remove forge qualifers.
	$replace = $forge;
} else {
	$forge = 'eclipse';
	$replace = '';
}

// If an id is provided, assume that it is the id of a single project
// and narrow the search to that. Note that #isValidProjectId should
// protect us against injection.
if (isValidProjectId($id = @$_GET['id'])) {
	$and[] = "(pp.ProjectId = '{$id}')";
}

// If a value is provided for "ago", then we limit ourselves to changes
// that have occurred at most that many days in the past. If no value
// is provided, we assume 10 as the default.
if (!preg_match('/^\d+$/', $ago = @$_GET['ago'])) $ago = 10;
$date = date('Y-m-d', strtotime("-$ago days"));

// We want all records that match either of the two conditions that follow...
$or = array();

// First, check the SYS_ModLog for entries indicating that a change has occurred
// in the PeopleProjects table. Identify those users that the log indicates have
// changed and just include all of their relationships (probably a bit of overkill,
// but doesn't hurt anything).
$or[] = "(p.PersonId in (SELECT PK1 FROM SYS_ModLog where LogTable='PeopleProjects' and ModDateTime > '{$date}'))";

// There may be cases where the active or inactive date suggests that a change
// that is not recorded in the log has occurred (or, potentially, the date of the
// log entry is different from the date recorded in the PeopleProjects table).
// Again, this might be overkill, but it's better that we do not miss anybody.
$or[] = "(pp.ActiveDate > date '$date' or pp.InactiveDate > date '$date')";

// Combine the "or" statements.
$and[] = '(' . implode(' or ', $or) . ')';

// Combine the "and" statements (the size of this array will vary).
$where = 'where ' . implode(' and ', $and);

// Export everybody who has ever had a project relationship.
$sql = "SELECT
	p.PersonId as id, p.FName, p.LName, p.Email, pp.ProjectId, pp.Relation, pp.ActiveDate, pp.InactiveDate
	from People as p join PeopleProjects as pp on p.PersonId = pp.PersonId
	$where";

$people = array();

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

while ($row=mysql_fetch_assoc($result)) {
	$id =  utf8_encode($row['id']);
	$people[$id]['id'] = $id;
	$people[$id]['first'] = $row['FName'];
	$people[$id]['last'] = $row['LName'];
	$people[$id]['email'] = $row['Email'];
	$people[$id]['roles'][] = array(
		// Remove the forge qualifer (if any).
		'project' => preg_replace("/^($replace)\./", '', $row['ProjectId']),
		'relation' => $row['Relation'],
		'active' => date('Y-m-d' , strtotime($row['ActiveDate'])),
		'inactive' => ($date = strtotime($row['InactiveDate'])) ? date('Y-m-d' , $date) : null
	);
}

$output['debug']['sql'][] = $sql;

/*
 * This is a starting point only. Ideally, I'd like to capture and manage
 * non-project-related roles (e.g. architecture council appointment) directly,
 * but--since I have no means of querying for ended relationships (we only
 * track an effective date in the Foundation database)--I can't do that right now.
 *
 * Note that this only captures appointed AC members, the AC chair (PMC representatives
 * should be captured by the previous queries) and Security Team members.
 *
 * TODO Extend to export AC organization representatives.
 * TODO Only export changes within the specified timeframe
 */

$sql = "SELECT
	p.PersonId as id, p.FName, p.LName, p.Email, pr.Relation, pr.EntryDate
	from People as p join PeopleRelations as pr on p.PersonId = pr.PersonId
		where relation in ('EA', 'AZ', 'SecTm')";

$result = $App->foundation_sql($sql);
while ($row=mysql_fetch_assoc($result)) {
	$id =  utf8_encode($row['id']);

	$people[$id]['id'] = $id;
	$people[$id]['first'] = $row['FName'];
	$people[$id]['last'] = $row['LName'];
	$people[$id]['email'] = $row['Email'];
	$people[$id]['roles'][] = array(
		'project' => null,
		'relation' => $row['Relation'],
		'active' => date('Y-m-d' , strtotime($row['EntryDate'])),
		'inactive' => null
	);
}

$output['debug']['sql'][] = $sql;

/*
 * Organization representatives to the Architecture Council.
 */
$sql = "SELECT
	p.PersonId as id, p.FName, p.LName, p.Email, oc.Relation
	from People as p join OrganizationContacts as oc on p.PersonId = oc.PersonId
		where relation in ('AC')";

$result = $App->foundation_sql($sql);
while ($row=mysql_fetch_assoc($result)) {
	$id =  utf8_encode($row['id']);

	$people[$id]['id'] = $id;
	$people[$id]['first'] = $row['FName'];
	$people[$id]['last'] = $row['LName'];
	$people[$id]['email'] = $row['Email'];
	$people[$id]['roles'][] = array(
		'project' => null,
		'relation' => $row['Relation'],
		'active' => null,
		'inactive' => null
	);
}

$output['debug']['sql'][] = $sql;

$output['people'] = $people;

echo json_encode($output);
?>