<?php

/*
* For Flyspray development tests only!
*
* Script for simulating Flyspray with many testdata like many projets, hundreds of users, thousands of tasks and thousands comments ..
* 
* TODO:
# replace some hardcoded IDs by getting the appropriate ids from db instead (autoincrement values of user groups for example)
# add some supertask_id to some tasks (use flyspray functions/api that should check if legal - no loops of any hop depth, permissions, cross project, existing task)
# add some related task relations
# add some dependencies to some tasks (flyspray should check legal - watch for logic deadlocks)
# add some 'is duplicate of' to some tasks (only when closing)
# Change: (simulate more daily managing work with tasks)
# * status of some tasks
# * progress of some tasks
# * category of some tasks
# * reported version of some tasks
# * milestone version of some tasks
# close some tasks with resolution status and text
# assign dev users to tasks
# add 'notify me' to some tasks
# add reminders to some tasks
# add user votes to some tasks
# add some close requests by some users
# deactivate and delete some users
# add some users 'lost password' requests
# add some failed user login attempts
# add/change some user avatar gif/png/jpg uploads
# add some real attachments with uploaded files of different type (generated .docx,.odt,.tex,.ps,.pdf,.txt,.xml,.sql)
# change some task descriptions:
# * add some kyrilic, greek, arab, chinese, emoji task description and task summaries
# * add some code segments for GeShi - some languages are harder to parse than others!
# tags:
# * remove some tags from tasks

* Maybe someday parts of it are moved to phpunit testing in future, so can automatic tested by travis-ci.
*
*/

# Only use this script after a fresh Flyspray install (1 project id=1 , 1 user with id=1, 1 task with id=1 existing)
# choose dokuwiki during setup
#createTestData();

# temp: just wrapped that code in a function so it is not run by phpunit
function createTestData(){
	# quick safety
	exit;

	if (PHP_SAPI !== 'cli') {
		die('Please call it only from commandline');
	}

	global $db, $fs, $conf, $proj, $user, $notify;

	# Use this only on a new test installation, code does not work on
	# an existing one, and never will.


 ### Simulation Settings ###
	# Set conservative data as default, setup bigger values for further performance tests.
	# maybe setting moved out of this function to make performance graphs with multiple runs..

	$years=10;
	$timerange=3600*24*365*$years;
	
	$maxprojects = 3;
	# ca 100 tasks/sec, 100 comments/sec on an old laptop with Flyspray 1.0-rc7 with mysqli setup in a virtual machine as thumb rule
	$maxtasks = 1000; # absolute number, e.g. 1000
	$maxcomments = 1000; # absolute number, e.g. 10000
	$maxattachments = 500; # only emulated yet, e.g. 500
	$maxversions = 3; # per project, e.g. 5
	$maxcorporates = 3; # mmhh
	
	# spread some user with different permissions
	$maxcorporateusers = 20; # absolute number, e.g. 20
	$maxadmins = 2;
	$maxmanagers = 2;
	$maxdevelopers = 500; # a bit higher for due they have more rights, can have more relations with tasks
	$maxindividualusers = 50;
	$maxviewers = 50;

  ### End of Simulation Settings ###

	$subjects[] = "help me";

	error_reporting(E_ALL);

	define('IN_FS', 1);

	$now=microtime(true); # simple performance times
	$start=$now;
	require_once dirname(__FILE__) . '/../includes/fix.inc.php';
	require_once dirname(__FILE__) . '/../includes/class.flyspray.php';
	require_once dirname(__FILE__) . '/../includes/constants.inc.php';
	require_once dirname(__FILE__) . '/../includes/i18n.inc.php';
	require_once dirname(__FILE__) . '/../includes/class.tpl.php';
	require_once dirname(__FILE__) . '/../vendor/autoload.php';

	$conf = parse_ini_file('../flyspray.conf.php', true) or die('Cannot open config file.');

	# faster generate new users with very weak, but fast password hash generation, only for this test.
	$conf['general']['passwdcrypt']='md5';

	error_reporting(E_ALL); # overwrite settings in fix.inc.php

	$db = new Database;
	$db->dbOpenFast($conf['database']);
	$RANDOP = 'RAND()';
	if ($db->dblink->dataProvider == 'postgres') {
		$RANDOP = 'RANDOM()';
	}
	$last=$now;$now=microtime(true);echo round($now-$last,6)." s database connection\n";


	$fs = new Flyspray();
	$user = new User(1);
	$proj = new Project(1);
	$notify = new Notifications;
	load_translations();

	$last=$now;$now=microtime(true);echo round($now-$last,6)." s Flyspray objects\n";

	for ($i = 1; $i <= $maxadmins; $i++) {
		$user_name = "admin$i";
		$real_name = "Admin $i";
		$password = $user_name;
		$time_zone = 0; // Assign different one!
		$email = null; // $user_name . '@example.com';

		Backend::create_user($user_name, $password, $real_name, '', $email, 0, $time_zone, 1, 1);
	}
	$last=$now;$now=microtime(true);echo round($now-$last,6).': '.$maxadmins." admins created\n";

	for ($i = 1; $i <= $maxmanagers; $i++) {
		$user_name = "pm$i";
		$real_name = "Project Manager $i";
		$password = $user_name;
		$time_zone = 0; // Assign different one!
		$email = null; // $user_name . '@example.com';

		Backend::create_user($user_name, $password, $real_name, '', $email, 0, $time_zone, 2, 1);
	}
	$last=$now;$now=microtime(true);echo round($now-$last,6).': '.$maxmanagers." managers created\n";

	$db->query('UPDATE {projects} SET project_is_active = 0 WHERE project_id = 1');
	// Show more columns by default, trying to make database or flyspray crash under stress.
	$db->query("UPDATE {prefs} SET pref_value = 'id project category tasktype severity summary status openedby dateopened progress comments attachments votes' WHERE pref_name = 'visible_columns'");

	// Add 3 different global developer groups with different
	// view rights first, then assign developers to them at random.

	$db->query("INSERT INTO {groups} "
        . "(group_name,group_desc,project_id,group_open,view_comments,manage_project,view_tasks, view_groups_tasks, view_own_tasks,open_new_tasks,modify_own_tasks) "
        . "VALUES('Developer Group 1', 'Developer Group 1', 0, 1, 1, 0, 1, 1, 1, 1, 1)");

	$db->query("INSERT INTO {groups} "
        . "(group_name,group_desc,project_id,group_open,view_comments,manage_project,view_tasks, view_groups_tasks, view_own_tasks,open_new_tasks,modify_own_tasks) "
        . "VALUES('Developer Group 2', 'Developer Group 2', 0, 1, 1, 0, 0, 1, 1, 1, 1)");

	$db->query("INSERT INTO {groups} "
        . "(group_name,group_desc,project_id,group_open,view_comments,manage_project,view_tasks, view_groups_tasks, view_own_tasks,open_new_tasks,modify_own_tasks) "
        . "VALUES('Developer Group 3', 'Developer Group 3', 0, 1, 1, 0, 0, 0, 1, 1, 1)");

	$last=$now;$now=microtime(true);echo round($now-$last,6).': '."3 global dev groups created\n";


	// Add also general groups for corporate users, individual users and viewers.
	// Allow only login. Not so relaxed with them bastards.
	$db->query("INSERT INTO {groups} "
	        . "(group_name,group_desc,project_id,group_open) "
	        . "VALUES('Corporate Users', 'Corporate Users', 0, 1)");

	$db->query("INSERT INTO {groups} "
        . "(group_name,group_desc,project_id,group_open) "
        . "VALUES('Trusted Users', 'Trusted Users', 0, 1)");

	$db->query("INSERT INTO {groups} "
        . "(group_name,group_desc,project_id,group_open) "
        . "VALUES('Non-trusted Users', 'Non-trusted Users', 0, 1)");
	$last=$now;$now=microtime(true);echo round($now-$last,6).': '."3 global user groups created\n";


	for ($i = 1; $i <= $maxdevelopers; $i++) {
		$user_name = "dev$i";
		$real_name = "Developer $i";
		$password = $user_name;
		$time_zone = 0;
		$email = null; // $user_name . '@example.com';
		$group = rand(7, 9);

		if($i==1){
			$registered = time() - rand($timerange-3600, $timerange);
		}else{
			$registered = $prevuserreg + rand(0, 0.9*2*$timerange/$maxdevelopers); # 0.9 to be sure not in future
                }
		Backend::create_user($user_name, $password, $real_name, '', $email, 0, $time_zone, $group, 1);
		# a bit	weired,	but simple UPDATE {users} SET register_date = ? WHERE user_id = (SELECT MAX(user_id) FROM {users}) doesn't work	for mysql
		$db->query('UPDATE {users} SET register_date = ? WHERE user_id = (SELECT user_id FROM (SELECT * FROM {users}) AS tempusers ORDER BY user_id DESC LIMIT 1)',
                        array($registered) );
		$prevuserreg=$registered;
	}
	$last=$now;$now=microtime(true);echo round($now-$last,6).': '.$maxdevelopers." dev users created\n";

	$tags=array(
                array('name'=>'blue', 'color'=>'#00c'),
                array('name'=>'red', 'color'=>'#c00'),
                array('name'=>'green', 'color'=>'#090'),
                array('name'=>'rosa', 'color'=>'#f9f'),
                array('name'=>'lila', 'color'=>'#c0c'),
                array('name'=>'black', 'color'=>'#000'),
                array('name'=>'brown', 'color'=>'#c90'),
                array('name'=>'darkred', 'color'=>'#600'),
                array('name'=>'darkblue', 'color'=>'#006')
        );
	
	// add some projects and some tag definitions
	$tgcounter=0;
	$project_id=0;
	for ($i = 1; $i <= $maxprojects; $i++) {
		$projname = 'Product '.($i+1);

		$db->query('INSERT INTO {projects}
				( project_title, theme_style, intro_message,
				others_view, anon_open, project_is_active,
				visible_columns, visible_fields, lang_code,
				notify_email, notify_jabber, disp_intro)
			VALUES (?, ?, ?, ?, ?, 1, ?, ?, ?, ?, ?, ?)',
			array($projname, 'CleanFS', "Welcome to $projname", 0, 0,
			'id category tasktype severity summary status openedby dateopened progress comments attachments votes',
			'supertask tasktype category severity priority status private assignedto reportedin dueversion duedate progress os votes',
			'en', '', '', 1)
		);
		$project_id=$db->insert_Id();
		add_project_data($project_id);

		for($t=0; $t<count($tags); $t++){
			$db->query("INSERT INTO {list_tag} (project_id, tag_name, show_in_list, class) VALUES (?, ?, ?, ?)",
				array($project_id, $tags[$t]['name'].($i+1), rand(0,1), $tags[$t]['color'])
			);
			$tgcounter++;
		}
	}

	$last=$now;$now=microtime(true);echo round($now-$last,6).': '.$maxprojects.' projects created, '.$tgcounter." tags created\n";

	// Assign some developers to project manager or project developer groups
	for ($i = 1; $i <= $maxprojects; $i++) {
		$projid = $i + 1;
		$sql = $db->query('SELECT group_id FROM {groups} WHERE project_id = ? AND manage_project = 1', array($projid));
		$pmgroup = $db->fetchOne($sql);
		$sql = $db->query('SELECT group_id FROM {groups} WHERE project_id = ? AND manage_project = 0', array($projid));
		$pdgroup = $db->fetchOne($sql);

		$pmlimit = intval($maxdevelopers / 100) + rand(-2, 2);
		$pdlimit = intval($maxdevelopers / 20) + rand(-10, 10);
		$pmlimit = $pmlimit < 1 ? 1 : $pmlimit;
		$pdlimit = $pdlimit < 1 ? 1 : $pdlimit;

		$sql = $db->query("SELECT user_id FROM {users_in_groups} WHERE group_id in (7, 8, 9) ORDER BY $RANDOP limit $pmlimit");
		$pms = $db->fetchCol($sql);
		$sql = $db->query("SELECT user_id FROM {users_in_groups} WHERE group_id in (8, 9) ORDER BY $RANDOP limit $pdlimit");
		$pds = $db->fetchCol($sql);

		foreach ($pms as $pm) {
			$db->query('INSERT INTO {users_in_groups} (user_id, group_id) values (?, ?)', array($pm, $pmgroup));
		}

		foreach ($pds as $pd) {
			$check = $db->query('SELECT * FROM {users_in_groups} WHERE user_id = ? AND group_id = ?', array($pd, $pmgroup));
			if (!$db->countRows($check)) {
				$db->query('INSERT INTO {users_in_groups} (user_id, group_id) values (?, ?)', array($pd, $pdgroup));
			}
		}
	}
	$last=$now;$now=microtime(true);echo round($now-$last,6).': '.$maxprojects." projects assigned some developers to project groups\n";

	for ($i = 1; $i <= $maxcorporateusers; $i++) {
	    $user_name = "cu$i";
	    $real_name = "Corporate user $i";
	    $password = $user_name;
	    $time_zone = 0; // Assign different ones!
	    $email = null; // $user_name . '@example.com';
	    $group = 10;

	    Backend::create_user($user_name, $password, $real_name, '', $email, 0, $time_zone, $group, 1);
	}
	$last=$now;$now=microtime(true);echo round($now-$last,6).': '.$maxcorporateusers." corp users created\n";

	// Now, create corporate user groups for some of our projects.
	// Just %5 change of getting added.
	for ($i = 1; $i <= $maxcorporates; $i++) {
		for ($j = 1; $j <= $maxprojects; $j++) {
			if (rand(1, 20) == 1) {
				$projid = $j + 1;
				$db->query("INSERT INTO {groups} "
	                    . "(group_name,group_desc,project_id,manage_project,view_tasks, view_groups_tasks, view_own_tasks,open_new_tasks,add_comments,create_attachments,group_open,view_comments) "
	                    . "VALUES('Corporate $i', 'Corporate $i Users', $projid, 0, 0, 1, 1, 1, 1, 1,1,1)");
				$group_id = $db->insert_ID();
				for ($k = $i; $k <= $maxcorporateusers; $k += $maxcorporates) {
					$username = "cu$k";
					$sql = $db->query('SELECT user_id FROM {users} WHERE user_name = ?', array($username));
					$user_id = $db->fetchOne($sql);
					$db->query('INSERT INTO {users_in_groups} (user_id, group_id) VALUES (?, ?)', array($user_id, $group_id));
				}
			}
		}
	}
	$last=$now;$now=microtime(true);echo round($now-$last,6).': '.$maxcorporates." corporate usergroups created\n";

	// And also those individual users...
	for ($i = 1; $i <= $maxindividualusers; $i++) {
		$user_name = "iu$i";
		$real_name = "Individual user $i";
		$password = $user_name;
		$time_zone = 0; // Assign different ones!
		$email = null; // $user_name . '@example.com';
		$group = rand(11, 12);

		Backend::create_user($user_name, $password, $real_name, '', $email, 0, $time_zone, $group, 1);
	}
	$last=$now;$now=microtime(true);echo round($now-$last,6).': '.$maxindividualusers." indi users created\n";


	// That's why we need some more global groups with different viewing rights
	for ($i = 1; $i <= $maxindividualusers; $i++) {
		$user_name = "basic$i";
		$real_name = "Basic $i";
		$password = $user_name;
		$time_zone = 0; // Assign different ones!
		$email = null; // $user_name . '@example.com';
		$group = 4;

		Backend::create_user($user_name, $password, $real_name, '', $email, 0, $time_zone, $group, 1);
	}
	$last=$now;$now=microtime(true);echo round($now-$last,6).': '.$maxindividualusers." basic users created\n";


	// Must recreate, so rights for new projects get loaded. Otherwise,
	// even first user in database can't create tasks.
	$user = new User(1);

	# for generating pseudo task description
	$vocals=array('e','e','a','i','o','u'); # e most freq vocal in western languages
	$conso=array('s','sch','st','z','r','l','b','p','g','k','m','n','v','w','d','t','qu');
	$wordlen=array(3,12);
	$clauselen=array(3,8); # 3: words per sub clause
	$commas=array(0,2); # 1: commas per sentence
	$paralen=array(1,5); # sentences per paragraph
	$parts=array(1,10); # parts per task description (paragraphs or lists or code..)
	$codes=array('','php','xml','sql','html');
	
	echo "Creating $maxtasks tasks: ";
	for ($i = 1; $i <= $maxtasks; $i++) {
		$project_id = rand(2, $maxprojects+1); # project id 1 is default project which we exclude here
		if ($i==1) {
			$opened = time() - rand($timerange-(30*24*3600), $timerange);
		} else {
			$opened = $prevtaskopened + rand(0, 0.9*2*$timerange/$maxtasks); # 0.9 to be sure not in future
		}
		// Find someone who is allowed to open a task, do not use global groups
		$sql = $db->query("SELECT u.user_id
			FROM {users} u
			JOIN {users_in_groups} uig ON u.user_id=uig.user_id
			JOIN {groups} g ON g.group_id = uig.group_id AND g.open_new_tasks = 1 AND (g.project_id = 0 OR g.project_id = ?)
			WHERE g.group_id NOT IN (1)
			AND u.register_date < ? 
			ORDER BY $RANDOP LIMIT 1", array($project_id, $opened)
		);
		$reporter = $db->fetchOne($sql);
		$sql = $db->query("SELECT category_id FROM {list_category}
			WHERE project_id = ?
			AND category_name <> 'root'
			ORDER BY $RANDOP LIMIT 1",
		array($project_id));
		$category = $db->fetchOne($sql);
		$args = array();

		$args['project_id'] = $project_id;
		$args['date_opened'] = $opened;
		// 'last_edited_time' => time(),
		$args['opened_by'] = $reporter;
		$args['product_category'] = $category;
		$args['task_severity'] = rand(1,5); # 5 fixed severities
		$args['task_priority'] = rand(1,6); # 6 fixed priorities
		$args['task_type'] = rand(1,2); # 2 global tasktypes after install
		// 'product_version'
		// 'operating_system'
		// 'estimated_effort'
		// 'supertask_id' - find existing task of project
		
		$sql = $db->query("SELECT project_title FROM {projects} WHERE project_id = ?",
		array($project_id));
		$projectname = $db->fetchOne($sql);
		$subject = $subjects[rand(0, count($subjects) - 1)];
		$subject = sprintf($subject, $projectname);

		$args['item_summary'] = "task $i ($subject)";

		$dparts=rand($parts[0],$parts[1]);
		$descr='';
		for($p=0;$p<$dparts;$p++){
			$para='';
			$type=rand(0,2); # text, list, code
			if($type==0){
				$dsent=rand($paralen[0],$paralen[1]);
				for($s=0;$s<$dsent;$s++){
					$sent='';
					$dcommas=rand($commas[0],$commas[1]);
					for($c=0;$c<$dcommas;$c++){
						$clausepart='';
						$dwords=rand($clauselen[0],$clauselen[1]);
						for($w=0;$w<$dwords;$w++){
							$v=rand(0,1);
							$wd='';
							$dletters=rand($wordlen[0],$wordlen[1]);
							for($l=0;$l<$dletters;$l++){
								$wd.= ($v % 2) ? $vocals[rand(0,count($vocals)-1)] : $conso[rand(0,count($conso)-1)];
								$v++;
							}
							if(rand(0,100)<1){
								$wd='FS#'.rand(2,$i);
							}
							if(rand(0,100)<2){
								$wd='//'.$wd.'//';
							}
							if(rand(0,100)<2){
								$wd='**'.$wd.'**';
							}
							if(rand(0,100)<2){
								$wd='__'.$wd.'__';
							}
							$clausepart.=$wd.' ';	
						}
						$sent.=$clausepart;
						$sent.=($c+1 < $dcommas) ? ', ': '.';
					}
					$para.=$sent;
				}
			}elseif($type==1){
				# dokuwiki list
				$para.="  * listitem\n  * listitem\n  * listitem3";
			}elseif($type==2) {
				# dokuwiki code
				$para.='<code '.$codes[rand(0, count($codes)-1)].'> some signs<<y<>>> """</code>';
			}
			$descr.=$para."\n\n";
		}
		$args['detailed_desc'] = $descr;

		$ok = Backend::create_task($args);
		if ($ok === 0) {
			echo "Failed to create task.\n";
		} else {
			list($task_id, $token) = $ok;
			$db->query('UPDATE {tasks} SET opened_by = ?, date_opened = ? WHERE task_id = ?',
			array($reporter, $opened, $task_id));

			$limit=rand(0,3);
			$db->query("INSERT INTO {task_tag} (task_id, tag_id) 
				SELECT $task_id, tag_id FROM {list_tag}
				WHERE project_id=?
				ORDER BY $RANDOP
				LIMIT $limit",
				array($project_id)
			);
		}
		$prevtaskopened=$opened;
		if($i%500==0){
                        echo $i.' mem:'.memory_get_usage()."\n";
                }
	} # end for maxtasks

	$last=$now;$now=microtime(true); echo round($now-$last,6).': '.$maxtasks." tasks created\n";

	echo "Creating $maxcomments comments: \n";
        $maxtask=$task_id;
	for ($i = 1; $i <= $maxcomments; $i++) {
		$taskid = rand(2, $maxtask);
		$task = Flyspray::getTaskDetails($taskid);
		$project_id = $task['project_id'];
		# XXX only allow comments after task created date and also later as existing comments in that task.
		$added = time() - rand(1, $timerange);

		// Find someone who is allowed to add comment, do not use global groups
		$sqltext = "SELECT uig.user_id
			FROM {users_in_groups} uig
                         JOIN {groups} g ON g.group_id = uig.group_id AND g.add_comments = 1
                          AND (g.project_id = 0 OR g.project_id = ?)
                        WHERE g.group_id NOT IN (1, 2, 7, 8, 9)
                     ORDER BY $RANDOP ";
		$sql = $db->query($sqltext, array($project_id));
		$row = $db->fetchRow($sql);
		$reporter = new User($row['user_id']);

		// User might still not be able to add a comment, if he can not see the task...
		// Just try again until a suitable one comes out from the query. It will finally.
		// Try to enhance the query also to return fewer unsuitable ones.
		while (!$reporter->can_view_task($task)) {
			$row = $db->fetchRow($sql);
			$reporter = new User($row['user_id']);
		}

		$comment = 'Comment.';
		$comment_id=Backend::add_comment($task, $comment);
		$db->query('UPDATE {comments} SET user_id = ?, date_added = ? WHERE comment_id = ?',
			array($reporter->id, $added, $comment_id));
		
		if($i%500==0){
                        echo $i.' mem:'.memory_get_usage()."\n";
                }
	} # end for maxcomments
	$last=$now;$now=microtime(true);echo round($now-$last,6).': '.$maxcomments." comments created\n";


	// And $maxattachments total, either to task or comment
	for ($i = 1; $i <= $maxattachments; $i++) {
		$sql = $db->query("SELECT comment_id, task_id, user_id, date_added FROM {comments} ORDER BY $RANDOP LIMIT 1");
		list($comment_id, $task_id, $user_id, $date_added) = $db->fetchRow($sql);
		$fname = "Attachment $i";
		if (rand(1, 100) == 1) {
			$comment_id = 0;
		}

		$origname = getAttachmentDescription() . " $i";
		$db->query("INSERT INTO {attachments}
			( task_id, comment_id, file_name,
				file_type, file_size, orig_name,
				added_by, date_added)
			VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
			array($task_id, $comment_id, $fname,
			'application/octet-stream', 1024,
			$origname,
			$user_id, $date_added));
	}
	$last=$now;$now=microtime(true);echo round($now-$last,6).': '.$maxattachments." pseudo attachments created\n";
	echo "\nTestdata filled in ".round($now-$start,1)." s.\n\n";
	$db->dbClose();
} // end function createTestData


function getAttachmentDescription() {
    $type = rand(1, 100);

    if ($type > 80 && $type <= 100) {
        return 'Information that might help solve the problem';
    }
    elseif ($type == 79) {
        return 'Pic of my pet alligator';
    }
    elseif ($type == 78) {
        return 'Pic of my pet rhinoceros';
    }
    elseif ($type == 77) {
        return 'Pic of my pet elephant';
    }
    elseif ($type == 76 || $type == 75) {
        return 'Pic of my pet monkey';
    }
    elseif ($type == 74 || $type == 73) {
        return 'Pic of my undulate';
    }
    elseif ($type == 72 || $type == 71) {
        return 'Pic of my goldfish';
    }
    elseif ($type == 70 || $type == 69) {
        return 'Pic of my pet pig';
    }
    elseif ($type == 68 || $type == 67) {
        return 'Pic of my pet snake';
    }
    elseif ($type == 66 || $type == 65) {
        return 'Pic of my pet rat';
    }
    elseif ($type == 64 || $type == 63) {
        return 'Pic of my pet goat';
    }
    elseif ($type == 62 || $type == 61) {
        return 'Pic of my pet rabbit';
    }
    elseif ($type == 60 || $type == 59) {
        return 'Pic of my pet gerbil';
    }
    elseif ($type == 58 || $type == 57) {
        return 'Pic of my pet hamster';
    }
    elseif ($type == 56 || $type == 55) {
        return 'Pic of my pet chinchilla';
    }
    elseif ($type == 54 || $type == 53) {
        return 'Pic of my pet guinea pig';
    }
    elseif ($type == 52 || $type == 51) {
        return 'Pic of my pet turtle';
    }
    elseif ($type == 50 || $type == 49) {
        return 'Pic of my pet lizard';
    }
    elseif ($type == 48 || $type == 47) {
        return 'Pic of my pet frog';
    }
    elseif ($type == 46 || $type == 45) {
        return 'Pic of my pet tarantula';
    }
    elseif ($type == 44 || $type == 43) {
        return 'Pic of my pet hermit crab';
    }
    elseif ($type == 42 || $type == 41) {
        return 'Pic of my pet parrot';
    }
    elseif ($type >= 40 && $type < 25) {
        return 'Pic of my dog';
    }
    else {
        return 'Pic of my cat';
    }
}

function add_project_data($pid = 0) {
	global $db;

	if(!$pid>0){
		$sql = $db->query('SELECT project_id FROM {projects} ORDER BY project_id DESC', false, 1);
		$pid = $db->fetchOne($sql);
	}

	$cols = array(
		'manage_project',
		'view_tasks',
		'open_new_tasks',
		'modify_own_tasks',
		'modify_all_tasks',
		'view_comments',
		'add_comments',
		'edit_comments',
		'delete_comments',
		'show_as_assignees',
		'create_attachments',
		'delete_attachments',
		'view_history',
		'add_votes',
		'close_own_tasks',
		'close_other_tasks',
		'assign_to_self',
		'edit_own_comments',
		'assign_others_to_self',
		'add_to_assignees',
		'view_reports',
		'group_open',
		'view_estimated_effort',
		'view_current_effort_done',
		'track_effort',
		'add_multiple_tasks',
		'view_roadmap',
		'view_own_tasks',
		'view_groups_tasks',
		'edit_assignments'
	);

	$args = array_fill(0, count($cols), '1');
	array_unshift($args, 'Project Managers', 'Permission to do anything related to this project.', intval($pid));
	$db->query("INSERT INTO {groups}
		( group_name, group_desc, project_id,
		" . join(',', $cols) . ")
		VALUES ( " . $db->fill_placeholders($cols, 3) . ")", $args);

	// Add 1 project specific developer group too.
	$args = array_fill(1, count($cols) - 1, '1');
	array_unshift($args, 'Project Developers', 'Permission to do almost anything but not manage project.', intval($pid), 0);
	$db->query("INSERT INTO {groups}
		( group_name, group_desc, project_id,
		" . join(',', $cols) . ")
		VALUES ( " . $db->fill_placeholders($cols, 3) . ")", $args);

	$db->query("INSERT INTO {list_category}
		( project_id, category_name,
		show_in_list, category_owner, lft, rgt)
		VALUES ( ?, ?, 1, 0, 1, 4)", array($pid, 'root'));

	$db->query("INSERT INTO {list_category}
		( project_id, category_name,
		show_in_list, category_owner, lft, rgt )
		VALUES ( ?, ?, 1, 0, 2, 3)", array($pid, 'Backend / Core'));

	$os = 1;
	$db->query("INSERT INTO {list_os}
		( project_id, os_name, list_position, show_in_list )
		VALUES  (?, ?, ?, 1)", array($pid, 'All', $os++));

	$totalversions = rand(3, 10);
	$present = rand(1, $totalversions);
	for ($i = 1; $i <= $totalversions; $i++) {
		$tense = ($i == $present ? 2 : ($i < $present ? 1 : 3));
		$db->query("INSERT INTO {list_version}
			( project_id, version_name, list_position, show_in_list, version_tense )
			VALUES (?, ?, ?, 1, ?)",
			array($pid, sprintf('%d.0', $i), $i, $tense)
		);
	}
} # end function add_project_data

?>
