<?php
/**
 * webtrees: online genealogy
 * Copyright (C) 2016 webtrees development team
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
namespace Fisharebest\Webtrees;

/**
 * Defined in session.php
 *
 * @global Tree $WT_TREE
 */
global $WT_TREE;

use Fisharebest\Webtrees\Controller\PageController;
use Fisharebest\Webtrees\Functions\FunctionsEdit;
use Fisharebest\Webtrees\Functions\FunctionsPrint;

define('WT_SCRIPT_NAME', 'edituser.php');
require './includes/session.php';

// Need to be logged in
if (!Auth::check()) {
	header('Location: ' . WT_BASE_URL);

	return;
}

// Extract form variables
$form_action         = Filter::post('form_action');
$form_username       = Filter::post('form_username');
$form_realname       = Filter::post('form_realname');
$form_pass1          = Filter::post('form_pass1', WT_REGEX_PASSWORD);
$form_pass2          = Filter::post('form_pass2', WT_REGEX_PASSWORD);
$form_email          = Filter::postEmail('form_email');
$form_rootid         = Filter::post('form_rootid', WT_REGEX_XREF);
$form_theme          = Filter::post('form_theme', implode('|', array_keys(Theme::themeNames())), '');;
$form_language       = Filter::post('form_language');
$form_timezone       = Filter::post('form_timezone');
$form_contact_method = Filter::post('form_contact_method');
$form_visible_online = Filter::postBool('form_visible_online');

// Respond to form action
if ($form_action && Filter::checkCsrf()) {
	switch ($form_action) {
	case 'update':
		if ($form_username !== Auth::user()->getUserName() && User::findByUserName($form_username)) {
			FlashMessages::addMessage(I18N::translate('Duplicate username. A user with that username already exists. Please choose another username.'));
		} elseif ($form_email !== Auth::user()->getEmail() && User::findByEmail($form_email)) {
			FlashMessages::addMessage(I18N::translate('Duplicate email address. A user with that email already exists.'));
		} else {
			// Change username
			if ($form_username !== Auth::user()->getUserName()) {
				Log::addAuthenticationLog('User ' . Auth::user()->getUserName() . ' renamed to ' . $form_username);
				Auth::user()->setUserName($form_username);
			}

			// Change password
			if ($form_pass1 && $form_pass1 === $form_pass2) {
				Auth::user()->setPassword($form_pass1);
			}

			// Change other settings
			Auth::user()
				->setRealName($form_realname)
				->setEmail($form_email)
				->setPreference('language', $form_language)
				->setPreference('TIMEZONE', $form_timezone)
				->setPreference('contactmethod', $form_contact_method)
				->setPreference('visibleonline', $form_visible_online ? '1' : '0');

			if ($form_theme === null) {
				Auth::user()->deletePreference('theme');
			} else {
				Auth::user()->setPreference('theme', $form_theme);
			}

			$WT_TREE->setUserPreference(Auth::user(), 'rootid', $form_rootid);
		}
		break;

	case 'delete':
		// An administrator can only be deleted by another administrator
		if (!Auth::user()->getPreference('canadmin')) {
			// Keep a reference to the currently logged in user because after logging out this user,
			// a call to Auth::user() will not return this user anymore
			$currentUser = Auth::user();
			Auth::logout();
			$currentUser->delete();
		}
		break;
	}

	header('Location: ' . WT_BASE_URL . WT_SCRIPT_NAME);

	return;
}

$controller = new PageController;
$controller
	->setPageTitle(I18N::translate('My account'))
	->pageHeader()
	->addExternalJavascript(WT_AUTOCOMPLETE_JS_URL)
	->addInlineJavascript('autocomplete();');

$my_individual_record = Individual::getInstance($WT_TREE->getUserPreference(Auth::user(), 'gedcomid'), $WT_TREE);
$default_individual   = Individual::getInstance($WT_TREE->getUserPreference(Auth::user(), 'rootid'), $WT_TREE);

// Form validation
?>
<script>
function checkform(frm) {
	if (frm.form_username.value=="") {
		alert("<?php echo I18N::translate('You must enter a username.'); ?>");
		frm.form_username.focus();
		return false;
	}
	if (frm.form_realname.value=="") {
		alert("<?php echo I18N::translate('You must enter a real name.'); ?>");
		frm.form_realname.focus();
		return false;
	}
	if (frm.form_pass1.value!=frm.form_pass2.value) {
		alert("<?php echo I18N::translate('The passwords do not match.'); ?>");
		frm.form_pass1.focus();
		return false;
	}
	if (frm.form_pass1.value.length > 0 && frm.form_pass1.value.length < 6) {
		alert("<?php echo I18N::translate('Passwords must contain at least 6 characters.'); ?>");
		frm.form_pass1.focus();
		return false;
	}
	return true;
}
</script>

<div id="edituser-page">
	<h2><?php echo $controller->getPageTitle(); ?></h2>

	<form name="editform" method="post" action="?" onsubmit="return checkform(this);">

		<input type="hidden" id="form_action" name="form_action" value="update">
		<?php echo Filter::getCsrf(); ?>

		<div id="edituser-table">
			<div class="label">
				<label for="form_username">
					<?php echo I18N::translate('Username'); ?>
				</label>
			</div>
			<div class="value">
				<input type="text" id="form_username" name="form_username" value="<?php echo Filter::escapeHtml(Auth::user()->getUserName()); ?>" dir="auto">
				<p class="small text-muted">
					<?php echo I18N::translate('Usernames are case-insensitive and ignore accented letters, so that “chloe”, “chloë”, and “Chloe” are considered to be the same.'); ?>
				</p>
			</div>

			<div class="label">
				<label for="form_realname">
					<?php echo I18N::translate('Real name'); ?>
				</label>
			</div>
			<div class="value">
				<input type="text" id="form_realname" name="form_realname" value="<?php echo Filter::escapeHtml(Auth::user()->getRealName()); ?>" dir="auto">
				<p class="small text-muted">
					<?php echo I18N::translate('This is your real name, as you would like it displayed on screen.'); ?>
				</p>
			</div>

			<div class="label">
				<?php echo I18N::translate('Individual record'); ?>
			</div>
			<div class="value">
				<?php if ($my_individual_record): ?>
				<?php echo $my_individual_record->formatList('span'); ?>
				<?php else: ?>
					<?php echo I18N::translateContext('unknown people', 'Unknown'); ?>
				<?php endif; ?>
				<p class="small text-muted">
					<?php echo I18N::translate('This is a link to your own record in the family tree. If this is the wrong individual, contact an administrator.'); ?>
				</p>
			</div>

			<div class="label">
				<label for="form_rootid">
					<?php echo I18N::translate('Default individual'); ?>
				</label>
			</div>
			<div class="value">
				<input data-autocomplete-type="INDI" type="text" name="form_rootid" id="form_rootid" value="<?php echo $WT_TREE->getUserPreference(Auth::user(), 'rootid'); ?>">
				<?php echo FunctionsPrint::printFindIndividualLink('form_rootid'); ?>
				<br>
				<?php if ($default_individual): ?>
				<?php echo $default_individual->formatList('span'); ?>
				<?php endif; ?>
				<p class="small text-muted">
					<?php echo I18N::translate('This individual will be selected by default when viewing charts and reports.'); ?>
				</p>
			</div>

			<div class="label">
				<label for="form_pass1">
					<?php echo I18N::translate('Password'); ?>
				</label>
			</div>
			<div class="value">
				<input type="password" id="form_pass1" name="form_pass1">
				<p class="small text-muted">
					<?php echo I18N::translate('Passwords must be at least 6 characters long and are case-sensitive, so that “secret” is different from “SECRET”.'); ?>
					<?php echo I18N::translate('Leave the password blank if you want to keep the current password.'); ?>
				</p>
			</div>

			<div class="label">
				<label for="form_pass2">
					<?php echo I18N::translate('Confirm password'); ?>
				</label>
			</div>
			<div class="value">
				<input type="password" id="form_pass2" name="form_pass2">
				<p class="small text-muted">
					<?php echo I18N::translate('Type your password again, to make sure you have typed it correctly.'); ?>
				</p>
			</div>

			<div class="label">
				<label for="form_language">
					<?php echo I18N::translate('Language'); ?>
				</label>
			</div>
			<div class="value">
				<?php echo FunctionsEdit::editFieldLanguage('form_language', Auth::user()->getPreference('language')); ?>
			</div>

			<div class="label">
				<label for="form_timezone">
					<?php echo I18N::translate('Time zone'); ?>
				</label>
			</div>
			<div class="value">
				<?php echo FunctionsEdit::selectEditControl('form_timezone', array_combine(\DateTimeZone::listIdentifiers(), \DateTimeZone::listIdentifiers()), null, Auth::user()->getPreference('TIMEZONE') ?: 'UTC', 'class="form-control"'); ?>
				<p class="small text-muted">
					<?php echo I18N::translate('The time zone is required for date calculations, such as knowing today’s date.'); ?>
				</p>
			</div>

			<div class="label">
				<label for="form_email">
					<?php echo I18N::translate('Email address'); ?>
				</label>
			</div>
			<div class="value">
				<input type="email" id="form_email" name="form_email" value="<?php echo Filter::escapeHtml(Auth::user()->getEmail()); ?>" size="50">
				<p class="small text-muted">
					<?php echo I18N::translate('This email address will be used to send password reminders, website notifications, and messages from other family members who are registered on the website.'); ?>
				</p>
			</div>
			<?php if (Site::getPreference('ALLOW_USER_THEMES')): ?>

			<div class="label">
				<label for="form_theme">
					<?php echo I18N::translate('Theme'); ?>
				</label>
			</div>
			<div class="value">
				<select id="form_theme" name="form_theme">
					<option value="">
						<?php echo Filter::escapeHtml(/* I18N: default option in list of themes */ I18N::translate('<default theme>')); ?>
					</option>
					<?php foreach (Theme::themeNames() as $theme_id => $theme_name): ?>
					<option value="<?php echo $theme_id; ?>" <?php echo $theme_id === Auth::user()->getPreference('theme') ? 'selected' : ''; ?>>
						<?php echo $theme_name; ?>
					</option>
					<?php endforeach; ?>
				</select>
				<p class="small text-muted">
					<?php echo /* I18N: Help text for the "Default theme" site configuration setting */ I18N::translate('You can change the appearance of webtrees using “themes”. Each theme has a different style, layout, color scheme, etc.'); ?>
				</p>
			</div>
			<?php endif; ?>

			<div class="label">
				<label for="form_contact_method">
					<?php echo I18N::translate('Contact method'); ?>
				</label>
			</div>
			<div class="value">
				<?php echo FunctionsEdit::editFieldContact('form_contact_method', Auth::user()->getPreference('contactmethod')); ?>
				<p class="small text-muted">
					<?php echo I18N::translate('Site members can send each other messages. You can choose to how these messages are sent to you, or choose not receive them at all.'); ?>
				</p>
			</div>

			<div class="label">
				<label for="form_visible_online">
					<?php echo I18N::translate('Visible to other users when online'); ?>
				</label>
			</div>
			<div class="value">
				<?php echo FunctionsEdit::checkbox('form_visible_online', Auth::user()->getPreference('visibleonline')); ?>
				<p class="small text-muted">
					<?php echo I18N::translate('You can choose whether to appear in the list of users who are currently signed-in.'); ?>
				</p>
			</div>
		</div>
		<div id="edituser_submit">
			<input type="submit" value="<?php echo I18N::translate('save'); ?>">
		</div>
		<?php if (!Auth::user()->getPreference('canadmin')): ?>
		<a href="#" onclick="if (confirm('<?php echo I18N::translate('Are you sure you want to delete “%s”?', Filter::escapeJs(Auth::user()->getUserName())); ?>')) {jQuery('#form_action').val('delete'); document.editform.submit(); }">
			<?php echo I18N::translate('Delete your account'); ?>
		</a>
		<?php endif; ?>
	</form>
</div>