<?php
include_once('functions.php');
include_once('ui-functions.php');
include_once('db.php');

if (session_status() === PHP_SESSION_NONE) {
	session_start();
	if (!isset($_SESSION['csrf_token']) || empty($_SESSION['csrf_token'])) {
		$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
	}
}

if (!proc_csrf() && $_GET['action'] != 'test') {
	die('[FATAL] Missing or wrong CSRF');
}

if (empty($_GET['action'])) {
	if (!isset($_SESSION['username'])) {
		$_GET['action'] = 'login';
	} else {
		$state = setup_state();
		$_GET['action'] = 'checklist';
	}
} else {
	if (empty($_SESSION['username']) && !in_array($_GET['action'], $config['actions']['unauthorized'], true)) {
		$return_to = $_GET['action'];
		$_GET['action'] = 'login';
	}
}

if (!empty($_SESSION['username']) && empty($state)) {
	$state = setup_state();
}

switch ($_GET['action']) {
case 'login':
	uiHeader();
	if($_SERVER['REQUEST_METHOD'] === 'POST') {
		process_login_post();
	} else {
		formLogin(return_to: $return_to ?? '');
	}
	uiFooter();
	break;
case 'logout':
	session_destroy();
	die(header('Location: index.php'));
case 'register':
	uiHeader();
	if($_SERVER['REQUEST_METHOD'] === 'POST') {
		process_register_post();
	} else {
		formRegister();
	}
	uiFooter();
	break;
case 'activate':
	uiHeader();
	process_activate();
	uiFooter();
	break;
case 'resend_activation':
	uiHeader();
	if ($_SERVER['REQUEST_METHOD'] === 'POST') {
		process_resend_activation_post();
	} else {
		formResend();
	}
	uiFooter();
	break;
case 'forgot_password':
	uiHeader();
	if ($_SERVER['REQUEST_METHOD'] === 'POST') {
		process_forgot_password_post();
	} else {
		formForgotPassword();
	}
	uiFooter();
	break;
case 'reset_password':
	uiHeader();
	if ($_SERVER['REQUEST_METHOD'] === 'POST') {
		process_reset_password_post();
	} else {
		$su_id = intval($_GET['u'] ?? 0);
		$verifier = $_GET['v'] ?? '';

		if ($su_id <= 0 || $verifier === '') {
			header('Location: index.php?action=forgot_password');
			return;
		}

		$student = fetch_student_user_by_su_id($su_id);
		if (!$student) {
			formLogin(errmsg: 'Invalid password reset request.  <a href="index.php?action=forgot_password">Click here</a> to request a new reset link.');
			uiFooter();
			break;
		}

		$reset_row = fetch_reset_expire(user_type: 'student', user_id: $su_id);
		if (!$reset_row) {
			formLogin(errmsg: 'This password reset link has expired or is invalid.  <a href="index.php?action=forgot_password">Click here</a> to request a new one.');
			uiFooter();
			break;
		}

		$expected_verifier = compute_reset_verifier(su_id: $su_id, email_address: $student['user_email'], expire_time: $reset_row['expire_time']);
		if ($expected_verifier !== $verifier || $reset_row['expire_time'] < date('Y-m-d H:i:s')) {
			delete_reset_expire(user_type: 'student', user_id: $su_id);
			formLogin(errmsg: 'This password reset link has expired or is invalid.  <a href="index.php?action=forgot_password">Click here</a> to request a new one.');
			uiFooter();
			break;
		}

		formResetPassword(su_id: $su_id, verifier: $verifier);
	}
	uiFooter();
	break;
case 'enrollment':
	uiHeader();
	if($_SERVER['REQUEST_METHOD'] === 'POST') {
		process_enrollment_post();
	} else {
		uiNav($state);
		uiContentStructure();
	}
	uiFooter();
	break;
case 'test':
	if($_SERVER['REQUEST_METHOD'] === 'POST') {
		debug_var('post', $_POST);
		foreach($_POST['test'] as $entry) {
			debug_var('entry', $entry);
			debug_var('empty', empty(array_filter($entry)));
		}
	} else {
	debug_var('dbh', $dbh);?>
	<form method="post">
		<label for="test[123][a]">test1</label>
		<input name="test[123][a]" type="text">
		<label for="test[123][b]">test2</label>
		<input name="test[123][b]" type="text">
		<label for="test[124][a]">test124</label>
		<input name="test[124][a]" type="text">
		<label for="test[124][b]">test2124</label>
		<input name="test[124][b]" type="text">
		<input type="submit">
	</form>
<?php
		if (!empty($state)) {
			debug_var('state', $state);
		}
		if (!empty($_SESSION)) {
			debug_var('session', $_SESSION);
		}
	}
	break;
default:
	uiHeader();
	uiNav($state);
	uiContentStructure();
	uiFooter();
	break;
}
?>
