<?php
/*******************************************************************************
 * Copyright (c) 2016 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'] . "/eclipse.org-common/system/nav.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php");
$App 	= new App();
$Nav	= new Nav();
$Menu 	= new Menu();
include($App->getProjectCommon());

require_once $_SERVER['DOCUMENT_ROOT'] . '/projects/classes/Project.class.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/projects/classes/common.php';
require_once dirname ( __FILE__ ) . '/../classes/database.inc';

mustBeFoundationEmployee();

#
# Begin: page-specific settings.  Change these.
$pageTitle 		= "Eclipse Project KPIs";
$pageKeywords	= "";
$pageAuthor		= "Wayne Beaton";

$js = "
// Load the Visualization API and the chart package.
google.load('visualization', '1.0', {'packages':['corechart']});
";

$App->addExtraHtmlHeader("<script type=\"text/javascript\" src=\"https://www.google.com/jsapi\"></script>");
$App->addExtraHtmlHeader("<script type=\"text/javascript\">$js</script>");

$ago = 36;

ob_start();

function renderCqProcessingTime($type = 'projectcode', $age = 5, $columns = array('checkin', 'approval')) {
	global $App;

	$sql = "
        select
            tlp as project,
        	type, count(*) as count,
        	avg(datediff(approved, pmc)) as avg_approval,
        	stddev(datediff(approved, pmc)) as stdev_approval,
        	max(datediff(approved, pmc)) as max_approval,
        	min(datediff(approved, pmc)) as min_approval,
        	avg(datediff(checkin, pmc)) as avg_checkin,
        	stddev(datediff(checkin, pmc)) as stdev_checkin,
        	max(datediff(checkin, pmc)) as max_checkin,
        	min(datediff(checkin, pmc)) as min_checkin
        from
        	(select
                p.name as tlp,
                c.name as project,
        		b.bug_id,
        		if(b.short_desc regexp '\((PB( Orbit)?)\s*\d*\)', 'piggyback', kd.name) as type,
        		date(b.creation_ts) as created,
        		if (max(date(pmc.bug_when)) is null, date(b.creation_ts), max(date(pmc.bug_when))) as start,
        		max(date(pmc.bug_when)) as pmc,
        		max(date(checkin.bug_when)) as checkin,
        		max(date(approved.bug_when)) as approved
        	from bugs as b
                join products as p on b.product_id = p.id
                join components as c on b.component_id = c.id
        		join keywords as k on b.bug_id=k.bug_id
        		join keyworddefs as kd on k.keywordid=kd.id and kd.name in ('thirdparty', 'projectcode')
        		left join bugs_activity as pmc on b.bug_id=pmc.bug_id and pmc.added in ('PMC_Approved+')
        		left join bugs_activity as checkin on b.bug_id=checkin.bug_id and checkin.added in ('checkin', 'checkintocvs')
        		left join bugs_activity as approved on b.bug_id=approved.bug_id and approved.added in ('approved', 'approved_all_projects')
        	where p.name not in ('foundation-internal', 'IP', 'dsdp')
        	   and date(b.creation_ts) > DATE_SUB(now(), INTERVAL %age MONTH)
        	group by p.id, b.bug_id) as stats
        where type='%type'
        group by tlp, type";

	$rows = array();
	query('ipzilla', $sql, array('%age' => $age, '%type' => $type), function ($row) use ($rows) {
	   $value = array($row['project']);
	   foreach($columns as $column) $value[] = $row["avg_" . $column];
	   $rows[] = $value;
	});

	$headers =  array(array('string', 'TLP'));
	foreach($columns as $column ) $headers[] = array('number', ucfirst($column));
	drawBarChart("CQStats$type", "Average days (CQs created in the last $age months)",
	        $headers,
	        $rows, 'Average time (days)', 'Top Level Project');

}

function renderCqCounts($type = 'projectcode', $age = 5) {
    global $App;

    $sql = "
        select
    		p.name as project,
            count(distinct b.bug_id) as count
    	from bugs as b
            join products as p on b.product_id=p.id
    		join keywords as k on b.bug_id=k.bug_id
    		join keyworddefs as kd on k.keywordid=kd.id and kd.name in ('thirdparty', 'projectcode')
        where kd.name = '%type'
    	   and date(b.creation_ts) > DATE_SUB(now(), INTERVAL %age MONTH)
    	group by p.name
    	order by p.name";

    $rows = array();
    query('ipzilla', $sql, array('%age' => $age, '%type' => $type), function ($row) use ($rows) {
     $rows[] = array($row['project'], $row['count']);
    });

    drawBarChart("CQCounts$type", "Total Count (CQs Created in the last $age months)",
            array(array('string', 'TLP'), array('number', 'CQ Count')),
            $rows, 'Number of CQ', 'Top Level Project');

}

function drawBarChart($id, $title, $columns, $values, $hlabel='', $vlabel= '', $width=800, $height=600) {
	global $App;

	$columnsJS = '';
	foreach($columns as $column) {
	    $type = $column[0];
	    $label = $column[1];
		$columnsJS .= "data.addColumn('$type','$label');";
	}

	$valuesJSON = json_encode($values, JSON_NUMERIC_CHECK);
	$js = "
		google.setOnLoadCallback(draw${id}Chart);
		function draw${id}Chart() {
			// Create the data table.
			var data = new google.visualization.DataTable();
			$columnsJS;
			data.addRows($valuesJSON);

			// Set chart options
			var options = {
				title:'$title',
				vAxis: {title: '$vlabel'},
				hAxis: {title: '$hlabel'},
				curveType: 'function',
				width:$width,
				height:$height,
				trendlines: { 0: {} }
			};

			// Instantiate and draw our chart, passing in some options.
			var chart = new google.visualization.BarChart(document.getElementById('${id}_div'));
			chart.draw(data, options);

			document.getElementById('${id}_div_png').outerHTML = '<a href=\"' + chart.getImageURI() + '\">Printable version</a>';
		}";

	$App->addExtraHtmlHeader("<script type=\"text/javascript\">$js</script>");

	echo "<div id=\"${id}_div\"></div>";
	echo "<div id=\"${id}_div_png\"></div>";
}

?>
<div id="maincontent">
<div id="midcolumn">
<h1><?= $pageTitle ?></h1>

<h3>Project Code Processing Averages</h3>

<p>Say something here.</p>

<?php renderCqProcessingTime('projectcode', $ago); ?>

<h3>Third-party Processing Averages</h3>

<p>Say something here.</p>

<?php renderCqProcessingTime('thirdparty', $ago); ?>


<h3>Piggyback Processing Averages</h3>

<p>Say something here.</p>

<?php renderCqProcessingTime('piggyback', $ago, array('approval')); ?>

<h3>Project Code CQ Count</h3>

<p>Say something here.</p>

<?php renderCqCounts('projectcode', $ago); ?>

<h3>Third Party CQ Count</h3>

<p>Say something here.</p>

<?php renderCqCounts('thirdparty', $ago); ?>

</div>
</div>

<?php
$html = ob_get_contents();
ob_end_clean();
$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
?>
