<?php
	$REQUIRE_LIB['md5'] = '';
	$REQUIRE_LIB['jquery.query'] = '';

	requirePHPLib('form');
	requirePHPLib('judger');
	
	if ($myUser == null || !isSuperUser($myUser)) {
		become403Page();
	}

	$register_form = new UOJForm('register');
	$register_form->submit_button_config['align'] = 'compressed';
	$register_form->addInput('new_username', 'text', '用户名', '',
		function ($new_username) {
			if (!validateUsername($new_username)) {
				return '用户名不合法';
			}
			if (queryUser($new_username)) {
				return '该用户已存在';
			}
			return '';
		},
		null
	);
	$register_form->addInput('new_password', 'password', '密码', '',
		function ($new_password) {
			return '';
		},
		null
	);
	$register_form->addInput('new_realname', 'text', '真实姓名', '',
		function ($new_realname) {
			return '';
		},
		null
	);
	$register_form->handle = function() {
		$new_username = $_POST['new_username'];
		$new_password = $_POST['new_password'];
		$new_realname = DB::escape($_POST['new_realname']);
		$new_password = hash_hmac('md5', $new_password, getPasswordClientSalt());
		$new_password = getPasswordToStore($new_password, $new_username);
		$svn_pw = uojRandString(10);

		DB::query("insert into user_info (username, realname, password, svn_password, register_time, usergroup) values ('$new_username', '$new_realname', '$new_password', '$svn_pw', now(), 'U')");
	};
	$register_form->runAtServer();

	$change_password_form = new UOJForm('change_password');
	$change_password_form->submit_button_config['align'] = 'compressed';
	$change_password_form->addInput('p_username', 'text', '用户名', '',
		function ($p_username) {
			if (!validateUsername($p_username)) {
				return '用户名不合法';
			}
			if (!queryUser($p_username)) {
				return '用户不存在';
			}
			return '';
		},
		null
	);
	$change_password_form->addInput('p_password', 'password', '密码', '',
		function ($p_password) {
			return '';
		},
		null
	);
	$change_password_form->handle = function() {
		$p_username = $_POST['p_username'];
		$p_password = $_POST['p_password'];
		$p_password = hash_hmac('md5', $p_password, getPasswordClientSalt());
		$p_password = getPasswordToStore($p_password, $p_username);

		DB::query("update user_info set password = '$p_password' where username = '$p_username'");
	};
	$change_password_form->runAtServer();

	$change_realname_form = new UOJForm('change_realname');
	$change_realname_form->submit_button_config['align'] = 'compressed';
	$change_realname_form->addInput('r_username', 'text', '用户名', '',
		function ($r_username) {
			if (!validateUsername($r_username)) {
				return '用户名不合法';
			}
			if (!queryUser($r_username)) {
				return '用户不存在';
			}
			return '';
		},
		null
	);
	$change_realname_form->addInput('r_realname', 'text', '真实姓名', '',
		function ($r_realname) {
			return '';
		},
		null
	);
	$change_realname_form->handle = function() {
		$r_username = $_POST['r_username'];
		$r_realname = DB::escape($_POST['r_realname']);

		DB::query("update user_info set realname = '$r_realname' where username = '$r_username'");
	};
	$change_realname_form->runAtServer();

	$user_form = new UOJForm('user');
	$user_form->submit_button_config['align'] = 'compressed';
	$user_form->addInput('username', 'text', '用户名', '',
		function ($username) {
			if (!validateUsername($username)) {
				return '用户名不合法';
			}
			if (!queryUser($username)) {
				return '用户不存在';
			}
			return '';
		},
		null
	);
	$options = array(
		'banneduser' => '设为封禁用户',
		'normaluser' => '设为普通用户',
		'superuser' => '设为超级用户'
	);
	$user_form->addSelect('op_type', $options, '操作类型', '');
	$user_form->handle = function() {
		global $user_form;
		
		$username = $_POST['username'];
		switch ($_POST['op_type']) {
			case 'banneduser':
				DB::update("update user_info set usergroup = 'B' where username = '{$username}'");
				DB::update("update user_info set usertype = 'banned' where username = '{$username}'");
				break;
			case 'normaluser':
				DB::update("update user_info set usergroup = 'U' where username = '{$username}'");
				DB::update("update user_info set usertype = 'student' where username = '{$username}'");
				break;
			case 'superuser':
				DB::update("update user_info set usergroup = 'S' where username = '{$username}'");
				DB::update("update user_info set usertype = 'student' where username = '{$username}'");
				break;
		}
	};
	$user_form->runAtServer();

	$usertype_form = new UOJForm('usertype');
	$user_form->submit_button_config['align'] = 'compressed';
	$usertype_form->addInput('usertype_username', 'text', '用户名', '',
		function ($username) {
			if (!validateUsername($username)) {
				return '用户名不合法';
			}
			if (!queryUser($username)) {
				return '用户不存在';
			}
			return '';
		},
		null
	);
	$usertype_options = array(
		'problem_uploader' => '题目上传者',
		'problem_manager' => '题目管理员',
		'contest_judger' => '比赛评测员',
		'contest_only' => '仅比赛参加者',
	);
	$usertype_form->addSelect('usertype_type', $usertype_options, '角色', '');
	$usertype_form->addSelect('usertype_op', array('add' => '添加', 'remove' => '移除'), '操作', '');
	$usertype_form->handle = function() {
		global $usertype_form;
		
		$username = $_POST['usertype_username'];
		switch ($_POST['usertype_type']) {
			case 'problem_uploader':
			case 'problem_manager':
			case 'contest_judger':
			case 'contest_only':
				$user = queryUser($username);
				$user = $_POST['usertype_op'] === 'add'
					? addUserType($user, $_POST['usertype_type'])
					: removeUserType($user, $_POST['usertype_type']);
				DB::update("update user_info set usertype = '{$user['usertype']}' where username = '{$username}'");
				break;
		}
	};
	$usertype_form->runAtServer();
	
	$blog_link_index = new UOJForm('blog_link_index');
	$blog_link_index->addInput('blog_id2', 'text', '博客ID', '',
		function ($x) {
			if (!validateUInt($x)) {
				return 'ID不合法';
			}
			if (!queryBlog($x)) {
				return '博客不存在';
			}
			return '';
		},
		null
	);
	$blog_link_index->addInput('blog_level', 'text', '置顶级别(删除不用填)', '0',
		function ($x) {
			if (!validateUInt($x)) {
				return '数字不合法';
			}
			if ($x > 3) {
				return '该级别不存在';
			}
			return '';
		},
		null
	);
	$options = array(
		'add' => '添加',
		'del' => '删除'
	);
	$blog_link_index->addSelect('op-type2', $options, '操作类型', '');
	$blog_link_index->handle = function() {
		$blog_id = $_POST['blog_id2'];
		$blog_level = $_POST['blog_level'];
		if ($_POST['op-type2'] == 'add') {
			if (DB::selectFirst("select * from important_blogs where blog_id = {$blog_id}")) {
				DB::update("update important_blogs set level = {$blog_level} where blog_id = {$blog_id}");
			} else {
				DB::insert("insert into important_blogs (blog_id, level) values ({$blog_id}, {$blog_level})");
			}
		}
		if ($_POST['op-type2'] == 'del') {
			DB::delete("delete from important_blogs where blog_id = {$blog_id}");
		}
	};
	$blog_link_index->runAtServer();
	
	$blog_deleter = new UOJForm('blog_deleter');
	$blog_deleter->addInput('blog_del_id', 'text', '博客ID', '',
		function ($x) {
			if (!validateUInt($x)) {
				return 'ID不合法';
			}
			if (!queryBlog($x)) {
				return '博客不存在';
			}
			return '';
		},
		null
	);
	$blog_deleter->handle = function() {
		deleteBlog($_POST['blog_del_id']);
	};
	$blog_deleter->runAtServer();

	$countdown_adder = new UOJForm('new_countdown');
	$countdown_adder->submit_button_config['align'] = 'compressed';
	$countdown_adder->addInput('new_countdown_title', 'text', '标题', '',
		function ($new_countdown_title) {
			return '';
		},
		null
	);
	$countdown_adder->addInput('new_countdown_endtime', 'text', '截止日期', date("Y-m-d H:i:s"),
		function($str, &$vdata) {
			try {
				$vdata['new_countdown_endtime'] = new DateTime($str);
			} catch (Exception $e) {
				return '无效时间格式';
			}
			return '';
		},
		null
	);
	$countdown_adder->handle = function() {
		$new_countdown_title = $_POST['new_countdown_title'];
		$new_countdown_endtime = $_POST['new_countdown_endtime'];
		$esc_countdown_title = DB::escape($new_countdown_title);

		DB::query("insert into countdowns (title, endtime) values ('$esc_countdown_title', '$new_countdown_endtime')");
	};
	$countdown_adder->runAtServer();

	$countdown_deleter = new UOJForm('delete_countdown');
	$countdown_deleter->submit_button_config['align'] = 'compressed';
	$countdown_deleter->addInput('delete_countdown_id', 'text', 'ID', '',
		function ($x) {
			if (!validateUInt($x)) {
				return 'ID不合法';
			}

			if (!DB::selectFirst("select * from countdowns where id = $x")) {
				return '倒计时不存在';
			}

			return '';
		},
		null
	);
	$countdown_deleter->handle = function() {
		$delete_countdown_id = $_POST['delete_countdown_id'];

		DB::query("delete from countdowns where id = $delete_countdown_id");
	};
	$countdown_deleter->runAtServer();

	$countdowns_header_row = <<<EOD
	<tr>
		<th>ID</th>
		<th>标题</th>
		<th>时间</th>
	</tr>
EOD;
	$countdowns_print_row = function($row) {
		echo <<<EOD
	<tr>
		<td>{$row['id']}</td>
		<td>{$row['title']}</td>
		<td>{$row['endtime']}</td>
	</tr>
EOD;
	};

	$friend_link_adder = new UOJForm('new_friend_link');
	$friend_link_adder->submit_button_config['align'] = 'compressed';
	$friend_link_adder->addInput('new_friend_link_title', 'text', '名称', '',
		function ($str) {
			return '';
		},
		null
	);
	$friend_link_adder->addInput('new_friend_link_url', 'text', '链接', '',
		function($str) {
			if (!validateURL($str)) {
				return '链接不合法';
			}

			return '';
		},
		null
	);
	$friend_link_adder->addInput('new_friend_link_level', 'text', '权重', '10',
		function($str) {
			if (!validateUInt($str)) {
				return '权重必须是数字';
			}

			return '';
		},
		null
	);
	$friend_link_adder->handle = function() {
		$new_friend_link_title = $_POST['new_friend_link_title'];
		$new_friend_link_url = $_POST['new_friend_link_url'];
		$new_friend_link_level = $_POST['new_friend_link_level'];
		$esc_new_friend_link_title = DB::escape($new_friend_link_title);
		$esc_new_friend_link_url = DB::escape($new_friend_link_url);

		DB::query("insert into friend_links (title, url, level) values ('$esc_new_friend_link_title', '$esc_new_friend_link_url', $new_friend_link_level)");
	};
	$friend_link_adder->runAtServer();

	$friend_link_deleter = new UOJForm('delete_friend_link');
	$friend_link_deleter->submit_button_config['align'] = 'compressed';
	$friend_link_deleter->addInput('delete_friend_link_id', 'text', 'ID', '',
		function ($id) {
			if (!validateUInt($id)) {
				return 'ID不合法';
			}

			if (!DB::selectFirst("select * from friend_links where id = $id")) {
				return 'ID不存在';
			}

			return '';
		},
		null
	);
	$friend_link_deleter->handle = function() {
		$delete_friend_link_id = $_POST['delete_friend_link_id'];

		DB::query("delete from friend_links where id = $delete_friend_link_id");
	};
	$friend_link_deleter->runAtServer();

	$friend_links_header_row = <<<EOD
	<tr>
		<th>ID</th>
		<th>名称</th>
		<th>链接</th>
		<th>置顶等级</th>
	</tr>
EOD;
	$friend_links_print_row = function($row) {
		echo <<<EOD
	<tr>
		<td>{$row['id']}</td>
		<td>{$row['title']}</td>
		<td>{$row['url']}</td>
		<td>{$row['level']}</td>
	</tr>
EOD;
	};

	$contest_submissions_deleter = new UOJForm('contest_submissions');
	$contest_submissions_deleter->addInput('contest_id', 'text', '比赛ID', '',
		function ($x) {
			if (!validateUInt($x)) {
				return 'ID不合法';
			}
			if (!queryContest($x)) {
				return '博客不存在';
			}
			return '';
		},
		null
	);
	$contest_submissions_deleter->handle = function() {
		$contest = queryContest($_POST['contest_id']);
		genMoreContestInfo($contest);
		
		$contest_problems = DB::selectAll("select problem_id from contests_problems where contest_id = {$contest['id']}");
		foreach ($contest_problems as $problem) {
			$submissions = DB::selectAll("select * from submissions where problem_id = {$problem['problem_id']} and submit_time < '{$contest['start_time_str']}'");
			foreach ($submissions as $submission) {
				$content = json_decode($submission['content'], true);
				unlink(UOJContext::storagePath().$content['file_name']);
				DB::delete("delete from submissions where id = {$submission['id']}");
				updateBestACSubmissions($submission['submitter'], $submission['problem_id']);
			}
		}
	};
	$contest_submissions_deleter->runAtServer();

	$custom_test_deleter = new UOJForm('custom_test_deleter');
	$custom_test_deleter->addInput('last', 'text', '删除末尾记录', '5',
		function ($x, &$vdata) {
			if (!validateUInt($x)) {
				return '不合法';
			}
			$vdata['last'] = $x;
			return '';
		},
		null
	);
	$custom_test_deleter->handle = function(&$vdata) {
		$all = DB::selectAll("select * from custom_test_submissions order by id asc limit {$vdata['last']}");
		foreach ($all as $submission) {
			$content = json_decode($submission['content'], true);
			unlink(UOJContext::storagePath().$content['file_name']);
		}
		DB::delete("delete from custom_test_submissions order by id asc limit {$vdata['last']}");
	};
	$custom_test_deleter->runAtServer();

	$judger_adder = new UOJForm('judger_adder');
	$judger_adder->addInput('judger_adder_name', 'text', '评测机名称', '',
		function ($x, &$vdata) {
			if (!validateUsername($x)) {
				return '不合法';
			}
			if (DB::selectCount("select count(*) from judger_info where judger_name='$x'")!=0) {
				return '不合法';
			}
			$vdata['name'] = $x;
			return '';
		},
		null
	);
	$judger_adder->handle = function(&$vdata) {
		$password=uojRandString(32);
		DB::insert("insert into judger_info (judger_name,password) values('{$vdata['name']}','{$password}')");
	};
	$judger_adder->runAtServer();
	
	$judger_deleter = new UOJForm('judger_deleter');
	$judger_deleter->addInput('judger_deleter_name', 'text', '评测机名称', '',
		function ($x, &$vdata) {
			if (!validateUsername($x)) {
				return '不合法';
			}
			if (DB::selectCount("select count(*) from judger_info where judger_name='$x'")!=1) {
				return '不合法';
			}
			$vdata['name'] = $x;
			return '';
		},
		null
	);
	$judger_deleter->handle = function(&$vdata) {
		DB::delete("delete from judger_info where judger_name='{$vdata['name']}'");
	};
	$judger_deleter->runAtServer();

	$judgerlist_cols = array('judger_name', 'password');
	$judgerlist_config = array();
	$judgerlist_header_row = <<<EOD
	<tr>
		<th>评测机名称</th>
		<th>密码</th>
	</tr>
EOD;
	$judgerlist_print_row = function($row) {
		echo <<<EOD
			<tr>
				<td>{$row['judger_name']}</td>
				<td>{$row['password']}</td>
			</tr>
EOD;
	};
	
	$userlist_cols = array('username', 'usergroup', 'usertype', 'register_time');
	$userlist_config = array('page_len' => 20,
			'table_classes' => array('table', 'table-bordered', 'table-hover', 'table-striped'));
	$userlist_header_row = <<<EOD
	<tr>
		<th>用户名</th>
		<th style="width: 6em">用户类别</th>
		<th style="width: 12em">注册时间</th>
	</tr>
EOD;

	$cur_tab = isset($_GET['tab']) ? $_GET['tab'] : 'users';

	$user_list_cond = array();
	if ($cur_tab === 'users') {
		if (isset($_GET['username']) && $_GET['username'] != "") {
			$user_list_cond[] = "username like '%" . DB::escape($_GET['username']) . "%'";
		}
		if (isset($_GET['usergroup']) && $_GET['usergroup'] != "") {
			$user_list_cond[] = "usergroup = '" . DB::escape($_GET['usergroup']) . "'";
		}
	}
	if ($user_list_cond) {
		$user_list_cond = join($user_list_cond, ' and ');
	} else {
		$user_list_cond = '1';
	}

	$userlist_print_row = function($row) {
		$hislink = getUserLink($row['username']);
		echo <<<EOD
			<tr>
				<td>${hislink}</td>
				<td>{$row['usergroup']}, {$row['usertype']}</td>
				<td>{$row['register_time']}</td>
			</tr>
EOD;
	};

	$tabs_info = array(
		'users' => array(
			'name' => '用户管理',
			'url' => "/super-manage/users"
		),
		'blogs' => array(
			'name' => '博客管理',
			'url' => "/super-manage/blogs"
		),
		'index' => array(
			'name' => '首页管理',
			'url' => '/super-manage/index'
		),
		'submissions' => array(
			'name' => '提交记录',
			'url' => "/super-manage/submissions"
		),
		'custom-test' => array(
			'name' => '自定义测试',
			'url' => '/super-manage/custom-test'
		),
		'judger' => array(
			'name' => '评测机管理',
			'url' => '/super-manage/judger'
		)
	);
	
	if (!isset($tabs_info[$cur_tab])) {
		become404Page();
	}
	?>
<?php
	requireLib('shjs');
	requireLib('morris');
	?>
<?php echoUOJPageHeader('系统管理') ?>
<div class="row">
	<div class="col-sm-3">
		<?= HTML::tablist($tabs_info, $cur_tab, 'nav-pills flex-column') ?>
	</div>
	
	<div class="col-sm-9">
		<?php if ($cur_tab === 'users'): ?>
			<h3>添加新用户</h3>
			<?php $register_form->printHTML(); ?>
			<h3>修改用户密码</h3>
			<?php $change_password_form->printHTML(); ?>
			<h3>用户类别设置</h3>
			<p>在此处更新用户所属类别后会自动重置用户权限。</p>
			<?php $user_form->printHTML(); ?>
			<h3>用户权限管理</h3>
			<?php $usertype_form->printHTML(); ?>
			<h3>修改用户真实姓名</h3>
			<?php $change_realname_form->printHTML(); ?>
			<h3>用户名单</h3>
			<div id="user-query">
				<form class="form-horizontal uoj-form-compressed" target="_self" method="GET">
					<div class="form-group">
						<label for="username" class="col-sm-2 control-label">用户名</label>
						<div class="col-sm-3">
							<input type="text" class="form-control" name="username" id="user-query-username" value="" />
						</div>
					</div>
					<div class="form-group">
						<label for="usergroup" class="col-sm-2 control-label">用户类别</label>
						<div class="col-sm-3">
							<select class="form-control" id="user-query-usergroup" name="usergroup">
								<option value="">*: 所有用户</option>
								<option value="B">B: 封禁用户</option>
								<option value="U">U: 普通用户</option>
								<option value="S">S: 超级用户</option>
							</select>
						</div>
					</div><div class="text-center"><button type="submit" id="user-query-submit" class="mt-2 btn btn-secondary">查询</button></div>
				</form>
			</div>
			<?php echoLongTable($userlist_cols, 'user_info', $user_list_cond, 'order by username asc', $userlist_header_row, $userlist_print_row, $userlist_config) ?>
		<?php elseif ($cur_tab === 'blogs'): ?>
			<div>
				<h4>添加到公告</h4>
				<?php $blog_link_index->printHTML(); ?>
			</div>
		
			<div>
				<h4>删除博客</h4>
				<?php $blog_deleter->printHTML(); ?>
			</div>
		<?php elseif ($cur_tab === 'index'): ?>
			<div>
				<h4>倒计时</h4>
				<?php echoLongTable(array('id', 'title', 'endtime'), 'countdowns', '1', 'order by endtime asc', $countdowns_header_row, $countdowns_print_row, $userlist_config) ?>
				<h5>添加倒计时</h5>
				<?php $countdown_adder->printHTML(); ?>
				<h5>删除倒计时</h5>
				<?php $countdown_deleter->printHTML(); ?>

				<h4>友情链接</h4>
				<?php echoLongTable(array('id', 'title', 'url', 'level'), 'friend_links', '1', 'order by level desc, id asc', $friend_links_header_row, $friend_links_print_row, $userlist_config) ?>
				<h5>添加友情链接</h5>
				<?php $friend_link_adder->printHTML(); ?>
				<h5>删除友情链接</h5>
				<?php $friend_link_deleter->printHTML(); ?>
			</div>
		<?php elseif ($cur_tab === 'submissions'): ?>
			<div>
				<h4>删除赛前提交记录</h4>
				<?php $contest_submissions_deleter->printHTML(); ?>
			</div>
			<div>
				<h4>测评失败的提交记录</h4>
				<?php echoSubmissionsList("result_error = 'Judgement Failed'", 'order by id desc', array('result_hidden' => ''), $myUser); ?>
			</div>
		<?php elseif ($cur_tab === 'custom-test'): ?>
		<?php $custom_test_deleter->printHTML() ?>
		<?php
				$submissions_pag = new Paginator(array(
					'col_names' => array('*'),
					'table_name' => 'custom_test_submissions',
					'cond' => '1',
					'tail' => 'order by id asc',
					'page_len' => 5
				));
			foreach ($submissions_pag->get() as $submission) {
				$problem = queryProblemBrief($submission['problem_id']);
				$submission_result = json_decode($submission['result'], true);
				echo '<dl class="dl-horizontal">';
				echo '<dt>id</dt>';
				echo '<dd>', "#{$submission['id']}", '</dd>';
				echo '<dt>problem_id</dt>';
				echo '<dd>', "#{$submission['problem_id']}", '</dd>';
				echo '<dt>submit time</dt>';
				echo '<dd>', $submission['submit_time'], '</dd>';
				echo '<dt>submitter</dt>';
				echo '<dd>', $submission['submitter'], '</dd>';
				echo '<dt>judge_time</dt>';
				echo '<dd>', $submission['judge_time'], '</dd>';
				echo '</dl>';
				echoSubmissionContent($submission, getProblemCustomTestRequirement($problem));
				echoCustomTestSubmissionDetails($submission_result['details'], "submission-{$submission['id']}-details");
			}
			?>
		<?= $submissions_pag->pagination() ?>
		<?php elseif ($cur_tab === 'judger'): ?>
			<div>
				<h4>添加评测机</h4>
				<?php $judger_adder->printHTML(); ?>
			</div>
			<div>
				<h4>删除评测机</h4>
				<?php $judger_deleter->printHTML(); ?>
			</div>
			<h3>评测机列表</h3>
			<?php echoLongTable($judgerlist_cols, 'judger_info', "1=1", '', $judgerlist_header_row, $judgerlist_print_row, $judgerlist_config) ?>
		<?php endif ?>
	</div>
</div>
<?php echoUOJPageFooter() ?>