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

require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/debug.php");
$App = new App();

header("Content-type: text/plain");

$year = date('Y', strtotime('now'));
$month = date('m', strtotime('now'));
$base = strtotime("-1 month", strtotime("$year-$month-01"));

// for ($i = 18; $i >= 0; $i--) {
// 	$start = strtotime("-$i month", $base);
// 	$end = strtotime("+1 month", $start);
	
// 	$period = date('M-Y', $start);
// 	$yearmonth = date('Ym', $start);
// 	$start = date('Y-m-d', $start);
// 	$end = date('Y-m-d', $end);
	
// 	$projectCount = findProjectCount($start, $end);
// 	$proposalCount = findProposalCount($start, $end);
// 	$committerCount = findCommitterCount($start, $end);
// 	$activeCommitterCount = findActiveCommitterCount($yearmonth);
// 	$companyCount = findCompanyCount($start, $end);
	
// 	echo "$period, $projectCount, $proposalCount, $committerCount, $activeCommitterCount, $companyCount\n";
	
// }

echo getProjectChartUrl();

function getProjectChartUrl($start=null, $count=18) {
	if (!$start) $start = strtotime('-1 month', strtotime(date('Y-m-01')));

	$labels = array();
	$projects = array();
	$active = array();
	
	for($index = $count-1;$index >= 0;$index--) {
		$period = strtotime("-$index month", $start);
		
		$labels[] = count($labels) % 3 == 2 ? date('M-Y', $period) : '';
		$projects[] = findProjectCount($period);
		$active[] = findActiveProjectCount($period);
	}
	
	$max = max(max($projects), max($active)) + 10;
	$min = min(min($projects), min($active)) - 10;
	
	$labels = join('|', $labels);
	$projects = join(',', $projects);
	$active = join(',', $active);
	
	$url = "http://chart.apis.google.com/chart
   		?chxl=0:|$labels
		&chxr=0,$min,$max|1,$min,$max
		&chxs=0,676767,11.5,0.5,lt,676767|1,676767,12.5,0,lt,676767
		&chxt=x,y
		&chs=460x220
		&cht=lc
		&chco=3072F3,FF9900
   		&chds=$min,$max,$min,$max
		&chd=t:$projects|$active
		&chdl=Total+Projects|Active+Projects
		&chdlp=b
		&chls=2|1
		&chma=5,0,5,15|5,5
		&chtt=Projects";
	
	return preg_replace('/\s/','',$url);
}

/**
 * This function returns the count of active projects during the provided
 * range of dates. A project is considered active if the IsActive flag is
 * set and it has at least one person active in any role during the range
 * of dates.
 *
 * @param int $period
 */
function findProjectCount($period) {
	global $App;

	$start = date('Y-m-01', $period);	
	$end = date('Y-m-d', strtotime('+1 month', strtotime($start)));
	
	$sql = "SELECT count(distinct Projects.ProjectID) 
		from Projects
			join PeopleProjects on (Projects.ProjectID = PeopleProjects.ProjectID)
		where
			Projects.IsActive
			and ActiveDate < date '$end'
			and (InactiveDate is null or InactiveDate > date '$start')";

	echo "$sql\n";
	$result = $App->foundation_sql($sql);
	if ($row = mysql_fetch_array($result)) return $row[0];
	return null;
}

function findActiveProjectCount($period) {
	return 25;
}

/**
* This function returns the count of committers who were active between the
* range of provided dates. A committer is considered active if they have
* a UNIX Account (i.e. they have been provisioned as a committer), were
* made active either before or during the provided range, and have either
* not been made inactive, or their inactive date is either after or during
* the provided range.
*
* @param date $start
* @param date $end
*/
function findCommitterCount($start, $end) {
	global $App;

	$sql = "SELECT 
			COUNT(DISTINCT PeopleProjects.PersonID) 
		from PeopleProjects
			join People on (PeopleProjects.PersonID = People.PersonID)
		WHERE
			Relation = 'CM' and IsUnixAcctCreated
			and ActiveDate < date '$end'
			and (InactiveDate is null or InactiveDate > date '$start')";

	$result = $App->foundation_sql($sql);
	if ($row = mysql_fetch_array($result)) return $row[0];
	return null;
}

/**
 * This function returns the count of companies who had at least one
 * committers who were active between the range of provided dates. A 
 * committer is considered active if they have
 * a UNIX Account (i.e. they have been provisioned as a committer), were
 * made active either before or during the provided range, and have either
 * not been made inactive, or their inactive date is either after or during
 * the provided range.
 * 
 * @param date $start
 * @param date $end
 */
function findCompanyCount($start, $end) {
	global $App;
	
	$sql = "SELECT
				count(distinct o.OrganizationID) 
			from People as p 
				join OrganizationContacts as o on (p.PersonID = o.PersonId) 
				join PeopleProjects as pr on (p.PersonId = pr.PersonId) 
			where 
				o.relation = 'EMPLY' and IsUnixAcctCreated 
				and pr.ActiveDate < date '$end' 
				and (pr.InActiveDate is null or pr.InActiveDate >= date '$start')";
	
	$result = $App->foundation_sql($sql);	
	if ($row = mysql_fetch_array($result)) return $row[0];	
	return null;
	
}

/**
 * Return the number of active committers during the specified period.
 * The period is specified in yearmonth form (e.g. 201108).
 * 
 * @param string $period
 */
function findActiveCommitterCount($period) {
	global $_activeCommitters;
	
	if (!$_activeCommitters) {
		$raw = file_get_contents('http://dash.eclipse.org/dash/commits/web-api/commit-kpis2.php');
		$lines = split("\n", $raw);
		$_activeCommitters = array();
		foreach($lines as $line) {
			$pair = split(',', $line);
			$month = $pair[0];
			$count = $pair[1];
			if (!$month) continue;
			if (!$count) continue;
			$_activeCommitters[$month] = $count;
		}
	}
	
	return $_activeCommitters[$period];
}

function findProposalCount($start, $end) {
	global $App;

	$sql = "SELECT 
			count(r.ProposalName)
		from ProjectReviews as r 
		join ProjectReviewStatus as s on (r.id = s.id)
		where
			s.status = 'Proposal Posted'
			and s.value >= date '$start' and s.value < '$end'";

	$result = $App->foundation_sql($sql);
	if ($row = mysql_fetch_array($result)) return $row[0];
	return null;

}

?>
