<?

/*
 * This file is part of the 'Science Fair In A Box' project
 * SFIAB Website: http://www.sfiab.ca
 *
 * Copyright (C) 2005 Sci-Tech Ontario Inc <info@scitechontario.org>
 * Copyright (C) 2005-2009 James Grant <james@lightbox.org>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public
 * License as published by the Free Software Foundation, version 2.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; see the file COPYING.  If not, write to
 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */
?>
<?
require ('../common.inc.php');
require_once ('../user.inc.php');
require_once ('../config_editor.inc.php');
user_auth_required('committee', 'config');
send_header('Year Rollover',
	array('Committee Main' => 'committee_main.php',
		'SFIAB Configuration' => 'config/index.php'),
	'rollover_fair_year');
?>

 <script language="javascript" type="text/javascript">
 function confirmYearRollover()
 {
 	var currentyear=<?= $config['FAIRYEAR'] ?>;
	var nextyear=document.forms.rollover.nextfairyear.value;
	if(nextyear<currentyear)
		alert('You cannot roll backwards in years!');
	else if(nextyear==currentyear)
		alert('You cannot roll to the same year!');
	else
	{

		var okay=confirm('Are you sure you want to roll the FAIRYEAR from '+currentyear+' to '+nextyear+'? This can not be undone and should only be done if you are absolutely sure!');
		if(okay)
			return true; 
	}
	return false;
 }
 </script>
 <?

function roll($currentfairyear, $newfairyear, $table, $where = '', $replace = array())
{
	global $pdo;

	/*
	 * Field 	Type 			Null 	Key 	Default 	Extra
	 * id 		int(10) unsigned 	NO 	PRI 	NULL 	auto_increment
	 * sponsors_id 	int(10) unsigned 	NO 	MUL 	0
	 * award_source_fairs_id int(10) unsigned YES  	   	NULL
	 */

	/* Get field list for this table */
	$q = $pdo->prepare("SHOW COLUMNS IN `$table`");
	$q->execute();
	show_pdo_errors_if_any($pdo);
	while (($c = $q->fetch(PDO::FETCH_ASSOC))) {
		$col[$c['Field']] = $c;
	}

	/* Record fields we care about */
	$fields = array();
	$keys = array_keys($col);
	foreach ($keys as $k) {
		/* Skip id field */
		if ($col[$k]['Extra'] == 'auto_increment')
			continue;
		/* Skip year field */
		if ($k == 'year')
			continue;

		$fields[] = $k;
	}

	if ($where == '')
		$where = '1';

	/* Get data */
	$q = $pdo->prepare("SELECT * FROM $table WHERE year='$currentfairyear' AND $where");
	$q->execute();
	show_pdo_errors_if_any($pdo);
	$names = '`' . join('`,`', $fields) . '`';

	/* Process data */
	while ($r = $q->fetch(PDO::FETCH_ASSOC)) {
		$vals = '';
		foreach ($fields as $f) {
			if (array_key_exists($f, $replace))
				$vals .= ',' . $pdo->quote($replace[$f]);
			else if ($col[$f]['Null'] == 'YES' && $r[$f] == NULL)
				$vals .= ',NULL';
			else
				$vals .= ',' . $pdo->quote($r[$f]);
		}

		$stmt = $pdo->prepare("INSERT INTO `$table`(`year`,$names) VALUES ('$newfairyear'$vals)");
		$stmt->execute();
		show_pdo_errors_if_any($pdo);
	}
}

if (get_value_from_array($_POST, 'action') == 'rollover' && get_value_from_array($_POST, 'nextfairyear')) {
	$newfairyear = intval(get_value_from_array($_POST, 'nextfairyear'));
	$currentfairyear = intval($config['FAIRYEAR']);

	$cy = $currentfairyear;
	$ny = $newfairyear;

	if ($newfairyear < $currentfairyear)
		echo error(i18n('You cannot roll backwards in years!'));
	else if ($newfairyear == $currentfairyear)
		echo error(i18n('You cannot roll to the same year!'));
	else {
		// okay here we go! this is going to get to be a pretty big script me thinks!

		// first, lets do all of the configuration variables
		echo i18n('Rolling configuration variables') . '<br />';
		config_update_variables($newfairyear, $currentfairyear);

		// now the dates
		echo i18n('Rolling dates') . '<br />';
		$q = $pdo->prepare("SELECT DATE_ADD(date,INTERVAL 365 DAY) AS newdate,name,description FROM dates WHERE year='$currentfairyear'");
		$q->execute();
		show_pdo_errors_if_any($pdo);
		while ($r = $q->fetch(PDO::FETCH_OBJ)) {
			$stmt = $pdo->prepare("INSERT INTO dates (date,name,description,year) VALUES (
				'" . $r->newdate . "',
				'" . $r->name . "',
				'" . $r->description . "',
				'" . $newfairyear . "')");
			$stmt->execute();
			show_pdo_errors_if_any($pdo);
		}

		// page text
		echo i18n('Rolling page texts') . '<br />';
		$q = $pdo->prepare("SELECT * FROM pagetext WHERE year='$currentfairyear'");
		$q->execute();
		show_pdo_errors_if_any($pdo);
		while ($r = $q->fetch(PDO::FETCH_OBJ)) {
			$stmt = $pdo->prepare("INSERT INTO pagetext (textname,textdescription,text,lastupdate,year,lang) VALUES (
				'" . $r->textname . "',
				'" . $r->textdescription . "',
				'" . $r->text . "',
				'" . $r->lastupdate . "',
				'" . $newfairyear . "',
                '" . $r->lang . "')");
			$stmt->execute();
			show_pdo_errors_if_any($pdo);
		}

		echo i18n('Rolling project categories') . '<br />';
		// project categories
		$q = $pdo->prepare("SELECT * FROM projectcategories WHERE year='$currentfairyear'");
		$q->execute();
		show_pdo_errors_if_any($pdo);
		while ($r = $q->fetch(PDO::FETCH_OBJ)) {
			$stmt = $pdo->prepare("INSERT INTO projectcategories (id,category,category_shortform,mingrade,maxgrade,year) VALUES (
				'" . $r->id . "',
				'" . $r->category . "',
				'" . $r->category_shortform . "',
				'" . $r->mingrade . "',
				'" . $r->maxgrade . "',
				'" . $newfairyear . "')");
			$stmt->execute();
			show_pdo_errors_if_any($pdo);
		}

		echo i18n('Rolling project divisions') . '<br />';
		// project divisions
		$q = $pdo->prepare("SELECT * FROM projectdivisions WHERE year='$currentfairyear'");
		$q->execute();
		show_pdo_errors_if_any($pdo);
		while ($r = $q->fetch(PDO::FETCH_OBJ)) {
			$stmt = $pdo->prepare("INSERT INTO projectdivisions (id,division,division_shortform,cwsfdivisionid,year) VALUES (
				'" . $r->id . "',
				'" . $r->division . "',
				'" . $r->division_shortform . "',
				'" . $r->cwsfdivisionid . "',
				'" . $newfairyear . "')");
			$stmt->execute();
			show_pdo_errors_if_any($pdo);
		}

		echo i18n('Rolling project category-division links') . '<br />';
		// project categories divisions links
		$q = $pdo->prepare("SELECT * FROM projectcategoriesdivisions_link WHERE year='$currentfairyear'");
		$q->execute();
		show_pdo_errors_if_any($pdo);
		while ($r = $q->fetch(PDO::FETCH_OBJ)) {
			$stmt = $pdo->prepare("INSERT INTO projectcategoriesdivisions_link (projectdivisions_id,projectcategories_id,year) VALUES (
				'" . $r->projectdivisions_id . "',
				'" . $r->projectcategories_id . "',
				'" . $newfairyear . "')");
			$stmt->execute();
			show_pdo_errors_if_any($pdo);
		}

		echo i18n('Rolling project sub-divisions') . '<br />';
		// project subdivisions
		$q = $pdo->prepare("SELECT * FROM projectsubdivisions WHERE year='$currentfairyear'");
		$q->execute();
		show_pdo_errors_if_any($pdo);
		while ($r = $q->fetch(PDO::FETCH_OBJ)) {
			$stmt = $pdo->prepare("INSERT INTO projectsubdivisions (id,projectdivisions_id,subdivision,year) VALUES (
				'" . $r->id . "',
				'" . $r->projectsubdivisions_id . "',
				'" . $r->subdivision . "',
				'" . $newfairyear . "')");
			$stmt->execute();
			show_pdo_errors_if_any($pdo);
		}

		echo i18n('Rolling safety questions') . '<br />';
		// safety questions
		$q = $pdo->prepare("SELECT * FROM safetyquestions WHERE year='$currentfairyear'");
		$q->execute();
		show_pdo_errors_if_any($pdo);
		while ($r = $q->fetch(PDO::FETCH_OBJ)) {
			$stmt = $pdo->prepare("INSERT INTO safetyquestions (question,type,required,ord,year) VALUES (
				'" . $r->question . "',
				'" . $r->type . "',
				'" . $r->required . "',
				'" . $r->ord . "',
				'" . $newfairyear . "')");
			$stmt->execute();
			show_pdo_errors_if_any($pdo);
		}

		echo i18n('Rolling awards') . '<br />';
		// awards

		$q = $pdo->prepare("SELECT * FROM award_awards WHERE year='$currentfairyear'");
		$q->execute();
		show_pdo_errors_if_any($pdo);
		while ($r = $q->fetch(PDO::FETCH_OBJ)) {
			/* Roll the one award */
			roll($cy, $ny, 'award_awards', "id='{$r->id}'");
			$award_awards_id = $pdo->lastInsertId();

			roll($cy, $ny, 'award_awards_projectcategories', "award_awards_id='{$r->id}'",
				array('award_awards_id' => $award_awards_id));

			roll($cy, $ny, 'award_awards_projectdivisions', "award_awards_id='{$r->id}'",
				array('award_awards_id' => $award_awards_id));
			echo i18n('&nbsp; Rolling award prizes') . '<br />';
			roll($cy, $ny, 'award_prizes', "award_awards_id='{$r->id}'",
				array('award_awards_id' => $award_awards_id));
		}

		echo i18n('Rolling award types') . '<br />';
		// award types
		$q = $pdo->prepare("SELECT * FROM award_types WHERE year='$currentfairyear'");
		$q->execute();
		show_pdo_errors_if_any($pdo);
		while ($r = $q->fetch(PDO::FETCH_OBJ)) {
			$stmt = $pdo->prepare("INSERT INTO award_types (id,type,`order`,year) VALUES (
				'" . $r->id . "',
				'" . $r->type . "',
				'" . $r->order . "',
				'" . $newfairyear . "')");
			$stmt->execute();
			show_pdo_errors_if_any($pdo);
		}

		echo i18n('Rolling schools') . '<br />';
		// award types
		$q = $pdo->prepare("SELECT * FROM schools WHERE year='$currentfairyear'");
		$q->execute();
		show_pdo_errors_if_any($pdo);
		while ($r = $q->fetch(PDO::FETCH_OBJ)) {
			$puid = ($r->principal_uid == null) ? 'NULL' : ("'" . intval($r->principal_uid) . "'");
			$shuid = ($r->sciencehead_uid == null) ? 'NULL' : ("'" . intval($r->sciencehead_uid) . "'");

			$stmt = $pdo->prepare('INSERT INTO schools (school,schoollang,schoollevel,board,district,phone,fax,address,city,province_code,postalcode,principal_uid,schoolemail,sciencehead_uid,accesscode,lastlogin,junior,intermediate,senior,registration_password,projectlimit,projectlimitper,year) VALUES (
				' . $pdo->quote($r->school) . ',
				' . $pdo->quote($r->schoollang) . ',
				' . $pdo->quote($r->schoollevel) . ',
				' . $pdo->quote($r->board) . ',
				' . $pdo->quote($r->district) . ',
				' . $pdo->quote($r->phone) . ',
				' . $pdo->quote($r->fax) . ',
				' . $pdo->quote($r->address) . ',
				' . $pdo->quote($r->city) . ',
				' . $pdo->quote($r->province_code) . ',
				' . $pdo->quote($r->postalcode) . ",$puid,
				" . $pdo->quote($r->schoolemail) . ",$shuid,
				" . $pdo->quote($r->accesscode) . ',
				NULL,
				' . $pdo->quote($r->junior) . ',
				' . $pdo->quote($r->intermediate) . ',
				' . $pdo->quote($r->senior) . ',
				' . $pdo->quote($r->registration_password) . ',
				' . $pdo->quote($r->projectlimit) . ',
				' . $pdo->quote($r->projectlimitper) . ',
				' . $newfairyear . ')');
			$stmt->execute();
			show_pdo_errors_if_any($pdo);
		}

		echo i18n('Rolling questions') . '<br />';
		$q = $pdo->prepare("SELECT * FROM questions WHERE year='$currentfairyear'");
		$q->execute();
		show_pdo_errors_if_any($pdo);
		while ($r = $q->fetch(PDO::FETCH_OBJ)) {
			$stmt = $pdo->prepare("INSERT INTO questions (id,year,section,db_heading,question,type,required,ord) VALUES (
				'',
				'$newfairyear',
				" . $pdo->quote($r->section) . ',
				' . $pdo->quote($r->db_heading) . ',
				' . $pdo->quote($r->question) . ',
				' . $pdo->quote($r->type) . ',
				' . $pdo->quote($r->required) . ',
				' . $pdo->quote($r->ord) . ')');
			$stmt->execute();
			show_pdo_errors_if_any($pdo);
		}

		// regfee items
		echo i18n('Rolling registration fee items') . '<br />';
		roll($cy, $ny, 'regfee_items');

		// volunteer positions
		echo i18n('Rolling volunteer positions') . '<br />';
		roll($cy, $ny, 'volunteer_positions');

		// timeslots and rounds
		echo i18n('Rolling judging timeslots and rounds') . '<br />';
		$q = $pdo->prepare("SELECT * FROM judges_timeslots WHERE year='$currentfairyear' AND round_id='0'");
		$q->execute();
		show_pdo_errors_if_any($pdo);
		while ($r = $q->fetch(PDO::FETCH_ASSOC)) {
			$d = $newfairyear - $currentfairyear;
			$stmt = $pdo->prepare("INSERT INTO judges_timeslots (`year`,`round_id`,`type`,`date`,`starttime`,`endtime`,`name`)
				VALUES ('$newfairyear','0','{$r['type']}',DATE_ADD('{$r['date']}', INTERVAL $d YEAR),
					'{$r['starttime']}','{$r['endtime']}','{$r['name']}')");
			$stmt->execute();
			show_pdo_errors_if_any($pdo);
			$round_id = $pdo->lastInsertId();
			$qq = $pdo->prepare("SELECT * FROM judges_timeslots WHERE round_id='{$r['id']}'");
			$qq->execute();
			show_pdo_errors_if_any($pdo);
			while ($rr = $qq->fetch(PDO::FETCH_ASSOC)) {
				$stmt = $pdo->prepare("INSERT INTO judges_timeslots (`year`,`round_id`,`type`,`date`,`starttime`,`endtime`)
						VALUES ('$newfairyear','$round_id','timeslot',DATE_ADD('{$rr['date']}', INTERVAL $d YEAR),
							'{$rr['starttime']}','{$rr['endtime']}')");
				$stmt->execute();
				show_pdo_errors_if_any($pdo);
			}
		}

		echo '<br /><br />';
		$stmt = $pdo->prepare("UPDATE config SET val='$newfairyear' WHERE var='FAIRYEAR' AND year=0");
		$stmt->execute();
		show_pdo_errors_if_any($pdo);
		echo happy(i18n('Fair year has been rolled over from %1 to %2', array($currentfairyear, $newfairyear)));
		send_footer();
		exit;
	}
}

echo '<br />';
echo '<a href="backuprestore.php">' . i18n('You should consider making a database backup before rolling over, just in case!') . "</a><br />\n";
echo '<br />';
echo '<form name="rollover" method="post" action="rollover.php" onsubmit="return confirmYearRollover()">';
echo '<input type="hidden" name="action" value="rollover" />';
echo i18n('Current Fair Year') . ': <b>' . $config['FAIRYEAR'] . '</b><br />';
$nextfairyear = $config['FAIRYEAR'] + 1;
echo i18n('Next Fair Year') . ": <input size=\"8\" type=\"text\" name=\"nextfairyear\" value=\"$nextfairyear\" />";
echo '<br />';
echo '<input type="submit" value="' . i18n('Rollover Fair Year') . '" />';
echo '</form>';

send_footer();
?>