<?php
requirePHPLib('form');
requirePHPLib('judger');
requirePHPLib('data');

Auth::check() || redirectToLogin();
UOJUser::checkPermission(Auth::user(), 'problems.view') || UOJResponse::page403();

if (UOJProblem::userCanCreateProblem(Auth::user())) {
	$default_statement = <<<'EOD'
## 题目描述

在此处填写题目描述。题目中的图片应上传至 S2OJ 图床中(点击顶栏 应用——图床 进入),以免丢失。

## 输入格式

在此处约定输入数据的格式。

## 输出格式

在此处说明输入数据的格式要求。

## 输入输出样例

### 样例输入 #1

```text
样例 1 的输入内容
```

### 样例输出 #1

```text
样例 1 的输出内容
```

### 样例解释 #1

样例 1 的解释与说明。

### 样例 #2

<!-- 大样例,如无大样例请删除本节。请根据实际情况修改下方的文件名。 -->

见右侧「附件下载」中的 `ex_data2.in/out`。

## 数据范围与约定

<!-- 请根据实际情况修改下方的数据范围。 -->

- 对于 $50\%$ 的数据,【替换此处】。
- 对于 $100\%$ 的数据,【替换此处】。

如有,在此处填写其他于题意或数据相关的说明。

EOD;
	$new_problem_form = new UOJForm('new_problem');
	$new_problem_form->handle = function () use ($default_statement) {
		DB::insert([
			"insert into problems",
			"(title, uploader, is_hidden, submission_requirement, extra_config)",
			"values", DB::tuple(["New Problem", Auth::id(), 1, "{}", "{}"])
		]);
		$id = DB::insert_id();
		DB::insert([
			"insert into problems_contents",
			"(id, statement, statement_md)",
			"values", DB::tuple([
				$id,
				HTML::purifier()->purify(HTML::parsedown()->text($default_statement)),
				$default_statement,
			])
		]);
		dataNewProblem($id);

		redirectTo("/problem/{$id}/manage/statement");
		die();
	};
	$new_problem_form->config['submit_container']['class'] = '';
	$new_problem_form->config['submit_button']['class'] = 'bg-transparent border-0 d-block w-100 px-3 py-2 text-start';
	$new_problem_form->config['submit_button']['text'] = '<i class="bi bi-plus-lg"></i> 新建本地题目';
	$new_problem_form->config['confirm']['text'] = '你真的要添加新题吗?';
	$new_problem_form->runAtServer();
}

function getProblemTR($info) {
	$problem = new UOJProblem($info);

	$html = HTML::tag_begin('tr', ['class' => 'text-center']);
	$html .= HTML::tag('td', ['class' => $info['submission_id'] ? 'table-success' : ''], "#{$info['id']}");
	$html .= HTML::tag_begin('td', ['class' => 'text-start']);
	$html .= $problem->getLink(['with' => 'none']);
	if ($problem->isUserOwnProblem(Auth::user())) {
		$html .= ' <a href="/problems?my=on"><span class="badge text-white bg-info">' . UOJLocale::get('problems::my problem') . '</span></a> ';
	}
	if ($info['type'] == 'remote') {
		$html .= ' ' . HTML::tag('a', ['class' => 'badge text-bg-success', 'href' => '/problems/remote'], '远端评测题');
	}
	if ($info['is_hidden']) {
		$html .= ' <a href="/problems?is_hidden=on"><span class="badge text-bg-danger"><i class="bi bi-eye-slash-fill"></i> ' . UOJLocale::get('hidden') . '</span></a> ';
	}
	if (isset($_COOKIE['show_tags_mode'])) {
		foreach ($problem->queryTags() as $tag) {
			$html .= ' <a class="uoj-problem-tag">' . '<span class="badge bg-secondary">' . HTML::escape($tag) . '</span>' . '</a> ';
		}
	}
	$html .= HTML::tag_end('td');
	if (isset($_COOKIE['show_submit_mode'])) {
		$perc = $info['submit_num'] > 0 ? round(100 * $info['ac_num'] / $info['submit_num']) : 0;

		$html .= HTML::tag(
			'td',
			[],
			HTML::tag(
				'div',
				[
					'class' => 'progress',
					'data-bs-toggle' => 'tooltip',
					'data-bs-title' => "{$info['ac_num']} / {$info['submit_num']}",
					'data-bs-placement' => 'bottom',
				],
				HTML::tag('div', [
					'class' => 'progress-bar bg-success',
					'role' => 'progressbar',
					'aria-valuenow' => $perc,
					'aria-valuemin' => 0,
					'aria-valuemax' => 100,
					'style' => "width: {$perc}%; min-width: 20px;",
				], "{$perc}%")
			)
		);
	}
	$html .= HTML::tag('td', [], $problem->getDifficultyHTML());
	$html .= HTML::tag('td', [], ClickZans::getCntBlock($problem->info['zan']));
	$html .= HTML::tag_end('tr');
	return $html;
}

$cond = [];
$search_tag = UOJRequest::get('tag', 'is_string', null);
$search_content = UOJRequest::get('search', 'is_string', '');
$search_is_effective = false;
$cur_tab = UOJRequest::get('tab', 'is_string', 'all');
if ($cur_tab == 'template') {
	$search_tag = "模板题";
} else if ($cur_tab == 'remote') {
	$cond['type'] = 'remote';
}
if (is_string($search_tag)) {
	$cond[] = [
		DB::rawvalue($search_tag), "in", DB::rawbracket([
			"select tag from problems_tags",
			"where", ["problems_tags.problem_id" => DB::raw("problems.id")]
		])
	];
}
if ($search_content !== '') {
	foreach (explode(' ', $search_content) as $key) {
		if (strlen($key) > 0) {
			$cond[] = DB::lor([
				[DB::instr(DB::raw('title'), $key), '>', 0],
				DB::exists([
					"select tag from problems_tags",
					"where", [
						[DB::instr(DB::raw('tag'), $key), '>', 0],
						"problems_tags.problem_id" => DB::raw("problems.id")
					]
				]),
				"id" => $key,
			]);
			$search_is_effective = true;
		}
	}
}

if (isset($_GET['is_hidden'])) {
	$cond['problems.is_hidden'] = true;
}

if (Auth::check() && isset($_GET['my'])) {
	$cond['problems.uploader'] = Auth::id();
}

if (isset($_GET['min_difficulty']) && $_GET['min_difficulty']) {
	$cond[] = ['problems.difficulty', '>=', $_GET['min_difficulty']];
}

if (isset($_GET['max_difficulty']) && $_GET['max_difficulty']) {
	$cond[] = ['problems.difficulty', '<=', $_GET['max_difficulty']];
}

if (empty($cond)) {
	$cond = '1';
}

$header = '<tr>';
$header .= '<th class="text-center" style="width:5em;">ID</th>';
$header .= '<th>' . UOJLocale::get('problems::problem') . '</th>';
if (isset($_COOKIE['show_submit_mode'])) {
	$header .= '<th class="text-center" style="width:125px;">' . UOJLocale::get('problems::ac ratio') . '</th>';
}
$header .= '<th class="text-center" style="width:4em;">' . UOJLocale::get('problems::difficulty') . '</th>';
$header .= '<th class="text-center" style="width:50px;">' . UOJLocale::get('appraisal') . '</th>';
$header .= '</tr>';

$tabs_info = [
	'all' => [
		'name' => UOJLocale::get('problems::all problems'),
		'url' => "/problems"
	],
	'template' => [
		'name' => UOJLocale::get('problems::template problems'),
		'url' => "/problems/template"
	],
	'remote' => [
		'name' => UOJLocale::get('problems::remote problems'),
		'url' => "/problems/remote"
	],
];

$pag = new Paginator([
	'col_names' => ['*'],
	'table_name' => [
		"problems left join best_ac_submissions",
		"on", [
			"best_ac_submissions.submitter" => Auth::id(),
			"problems.id" => DB::raw("best_ac_submissions.problem_id")
		],
	],
	'cond' => $cond,
	'tail' => "order by id asc",
	'page_len' => 40,
	'post_filter' => function ($problem) {
		return (new UOJProblem($problem))->userCanView(Auth::user());
	}
]);

// if ($search_is_effective) {
// 	$search_summary = [
// 		'count_in_cur_page' => $pag->countInCurPage(),
// 		'first_a_few' => []
// 	];
// 	foreach ($pag->get(5) as $info) {
// 		$problem = new UOJProblem($info);
// 		$search_summary['first_a_few'][] = [
// 			'type' => 'problem',
// 			'id' => $problem->info['id'],
// 			'title' => $problem->getTitle()
// 		];
// 	}
// 	DB::insert([
// 		"insert into search_requests",
// 		"(created_at, remote_addr, type, cache_id, q, content, result)",
// 		"values", DB::tuple([DB::now(), UOJContext::remoteAddr(), 'search', 0, $search_content, UOJContext::requestURI(), json_encode($search_summary)])
// 	]);
// }
?>
<?php echoUOJPageHeader(UOJLocale::get('problems')) ?>

<div class="row">
	<!-- left col -->
	<div class="col-md-9">
		<!-- title -->
		<div class="d-flex justify-content-between flex-wrap">
			<h1>
				<?= UOJLocale::get('problems') ?>
			</h1>

			<div>
				<?= HTML::tablist($tabs_info, $cur_tab, 'nav-pills') ?>
			</div>
		</div>
		<!-- end title -->

		<?= $pag->pagination() ?>

		<div class="text-end">
			<div class="form-check d-inline-block me-2">
				<input type="checkbox" id="input-show_tags_mode" class="form-check-input" <?= isset($_COOKIE['show_tags_mode']) ? 'checked="checked" ' : '' ?> />
				<label class="form-check-label" for="input-show_tags_mode">
					<?= UOJLocale::get('problems::show tags') ?>
				</label>
			</div>

			<div class="form-check d-inline-block">
				<input type="checkbox" id="input-show_submit_mode" class="form-check-input" <?= isset($_COOKIE['show_submit_mode']) ? 'checked="checked" ' : '' ?> />
				<label class="form-check-label" for="input-show_submit_mode">
					<?= UOJLocale::get('problems::show statistics') ?>
				</label>
			</div>
		</div>

		<script type="text/javascript">
			$('#input-show_tags_mode').click(function() {
				if (this.checked) {
					$.cookie('show_tags_mode', '', {
						path: '/problems',
						expires: 365,
					});
				} else {
					$.removeCookie('show_tags_mode', {
						path: '/problems',
					});
				}
				location.reload();
			});
			$('#input-show_submit_mode').click(function() {
				if (this.checked) {
					$.cookie('show_submit_mode', '', {
						path: '/problems',
						expires: 365,
					});
				} else {
					$.removeCookie('show_submit_mode', {
						path: '/problems'
					});
				}
				location.reload();
			});
		</script>

		<div class="card my-3">
			<?=
			HTML::responsive_table($header, $pag->get(), [
				'table_attr' => [
					'class' => ['table', 'uoj-table', 'mb-0'],
				],
				'tr' => function ($row, $idx) {
					return getProblemTR($row);
				}
			]);
			?>
		</div>

		<?= $pag->pagination() ?>

	</div>
	<!-- end left col -->

	<!-- right col -->
	<aside class="col-md-3 mt-3 mt-md-0">
		<!-- search bar -->
		<form method="get" class="mb-3" id="form-problem_search">
			<div class="input-group mb-3">
				<input id="search-input" name="search" type="text" class="form-control" placeholder="搜索">
				<button class="btn btn-outline-secondary" type="submit">
					<i class="bi bi-search"></i>
				</button>
			</div>
			<div>
				<?php if (Auth::check()) : ?>
					<div class="form-check d-inline-block">
						<input type="checkbox" name="my" <?= isset($_GET['my']) ? 'checked="checked"' : '' ?> class="form-check-input" id="input-my">
						<label class="form-check-label" for="input-my">
							我的题目
						</label>
					</div>
				<?php endif ?>
				<?php if (UOJProblem::userCanManageSomeProblem(Auth::user())) : ?>
					<div class="form-check d-inline-block ms-2">
						<input type="checkbox" name="is_hidden" <?= isset($_GET['is_hidden']) ? 'checked="checked"' : '' ?> class="form-check-input" id="input-is_hidden">
						<label class="form-check-label" for="input-is_hidden">
							隐藏题目
						</label>
					</div>
				<?php endif ?>
			</div>

			<div class="card mt-3">
				<div class="card-header fw-bold">
					题目难度
				</div>
				<div class="card-body">
					<div class="input-group input-group-sm">
						<input type="text" class="form-control" name="min_difficulty" id="input-min_difficulty" maxlength="4" style="width:4em" placeholder="800" value="<?= HTML::escape($_GET['min_difficulty']) ?>" autocomplete="off" />
						<span class="input-group-text">~</span>
						<input type="text" class="form-control" name="max_difficulty" id="input-max_difficulty" maxlength="4" style="width:4em" placeholder="3500" value="<?= HTML::escape($_GET['max_difficulty']) ?>" autocomplete="off" />
						<button type="submit" class="btn btn-outline-secondary">
							<i class="bi bi-funnel"></i>
						</button>
					</div>
				</div>
			</div>
		</form>
		<script>
			$('#search-input').val(new URLSearchParams(location.search).get('search'));
			$('#input-my, #input-is_hidden, #input-difficulty').change(function() {
				$('#form-problem_search').submit();
			});
		</script>

		<?php if (UOJProblem::userCanCreateProblem(Auth::user())) : ?>
			<div class="card mb-3">
				<div class="card-header fw-bold">
					新建题目
				</div>
				<div class="list-group list-group-flush">
					<div class="list-group-item list-group-item-action p-0">
						<?php $new_problem_form->printHTML() ?>
					</div>
					<a class="list-group-item list-group-item-action" href="/problems/remote/new">
						<i class="bi bi-cloud-plus"></i>
						新建远端评测题目
					</a>
				</div>
			</div>
		<?php endif ?>

		<!-- sidebar -->
		<?php uojIncludeView('sidebar') ?>
	</aside>

</div>

<?php echoUOJPageFooter() ?>