<?php
	requirePHPLib('judger');

	if (!Auth::check()) {
		become403Page(UOJLocale::get('need login'));
	}

	if (!isNormalUser($myUser) && $_GET['type'] != 'attachment') {
		become403Page();
	}

	switch ($_GET['type']) {
		case 'attachment':
			if (!validateUInt($_GET['id']) || !($problem = queryProblemBrief($_GET['id']))) {
				become404Page();
			}
			
			$visible = isProblemVisibleToUser($problem, $myUser);
			if (!$visible && $myUser != null) {
				$result = DB::query("select contest_id from contests_problems where problem_id = {$_GET['id']}");
				while (list($contest_id) = DB::fetch($result, MYSQLI_NUM)) {
					$contest = queryContest($contest_id);
					genMoreContestInfo($contest);
					if ($contest['cur_progress'] != CONTEST_NOT_STARTED && hasRegistered($myUser, $contest) && queryContestProblemRank($contest, $problem)) {
						$visible = true;
					}
				}
			}
			if (!$visible) {
				become404Page();
			}

			$id = $_GET['id'];
			
			$file_name = "/var/uoj_data/$id/download.zip";
			$download_name = "problem_{$id}_attachment.zip";
			break;

		case 'problem':
			if (!validateUInt($_GET['id']) || !($problem = queryProblemBrief($_GET['id']))) {
				become404Page();
			}

			if (!isProblemVisibleToUser($problem, $myUser)) {
				become404Page();
			}

			$id = $_GET['id'];
			$file_name = "/var/uoj_data/$id.zip";
			$download_name = "problem_$id.zip";

			break;

		case 'testcase':
			if (!validateUInt($_GET['id']) || !($problem = queryProblemBrief($_GET['id']))) {
				become404Page();
			}

			if (!isProblemVisibleToUser($problem, $myUser)) {
				become404Page();
			}

			$id = $_GET['id'];
			$problem_conf = getUOJConf("/var/uoj_data/$id/problem.conf");

			if ($problem_conf == -1 || $problem_conf == -2) {
				become404Page();
			}

			if (!validateUInt($_GET['testcase_id'])) {
				become404Page();
			}

			$testcase_id = $_GET['testcase_id'];
			$testcase_group = isset($_GET['testcase_group']) && $_GET['testcase_group'] == 'extra' ? 'extra' : 'normal';

			if ($testcase_group == 'extra') {
				$n_ex_tests = getUOJConfVal($problem_conf, 'n_ex_tests', 0);

				if ($testcase_id < 1 || $testcase_id > $n_ex_tests) {
					become404Page();
				}

				switch ($_GET['testcase_type']) {
					case 'input':
						$file_name = "/var/uoj_data/$id/" . getUOJProblemExtraInputFileName($problem_conf, $testcase_id);
						$download_name = getUOJProblemExtraInputFileName($problem_conf, $testcase_id);
						break;

					case 'output':
						$file_name = "/var/uoj_data/$id/" . getUOJProblemExtraOutputFileName($problem_conf, $testcase_id);
						$download_name = getUOJProblemExtraOutputFileName($problem_conf, $testcase_id);
						break;

					default:
						become404Page();
				}
			} else {
				$n_tests = getUOJConfVal($problem_conf, 'n_tests', 10);

				if ($testcase_id < 1 || $testcase_id > $n_tests) {
					become404Page();
				}

				switch ($_GET['testcase_type']) {
					case 'input':
						$file_name = "/var/uoj_data/$id/" . getUOJProblemInputFileName($problem_conf, $testcase_id);
						$download_name = getUOJProblemInputFileName($problem_conf, $testcase_id);
						break;
					case 'output':
						$file_name = "/var/uoj_data/$id/" . getUOJProblemOutputFileName($problem_conf, $testcase_id);
						$download_name = getUOJProblemOutputFileName($problem_conf, $testcase_id);
						break;
					default:
						become404Page();
				}
			}

			break;

		case 'testlib.h':
			$file_name = "/opt/uoj/judger/uoj_judger/include/testlib.h";
			$download_name = "testlib.h";
			break;

		default:
			become404Page();
	}
	
	$finfo = finfo_open(FILEINFO_MIME);
	$mimetype = finfo_file($finfo, $file_name);
	if ($mimetype === false) {
		become404Page();
	}
	finfo_close($finfo);
	
	header("X-Sendfile: $file_name");
	header("Content-type: $mimetype");
	header("Content-Disposition: attachment; filename=$download_name");
	?>