<?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;

use Fisharebest\Webtrees\Controller\PageController;
use Fisharebest\Webtrees\Functions\FunctionsEdit;
use Fisharebest\Webtrees\Module\AbstractModule;
use Fisharebest\Webtrees\Module\ModuleBlockInterface;
use Fisharebest\Webtrees\Module\ModuleChartInterface;
use Fisharebest\Webtrees\Module\ModuleConfigInterface;
use Fisharebest\Webtrees\Module\ModuleMenuInterface;
use Fisharebest\Webtrees\Module\ModuleReportInterface;
use Fisharebest\Webtrees\Module\ModuleSidebarInterface;
use Fisharebest\Webtrees\Module\ModuleTabInterface;
use Fisharebest\Webtrees\Module\ModuleThemeInterface;

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

$controller = new PageController;
$controller
	->restrictAccess(Auth::isAdmin())
	->setPageTitle(I18N::translate('Module administration'));

$modules       = Module::getInstalledModules('disabled');
$module_status = Database::prepare("SELECT module_name, status FROM `##module`")->fetchAssoc();

uasort($modules, function (AbstractModule $x, AbstractModule $y) {
	return I18N::strcasecmp($x->getTitle(), $y->getTitle());
});

if (Filter::post('action') === 'update_mods' && Filter::checkCsrf()) {
	foreach ($modules as $module) {
		$new_status = Filter::post('status-' . $module->getName(), '[01]');
		if ($new_status !== null) {
			$new_status = $new_status ? 'enabled' : 'disabled';
			$old_status = $module_status[$module->getName()];
			if ($new_status !== $old_status) {
				Database::prepare("UPDATE `##module` SET status=? WHERE module_name=?")->execute([$new_status, $module->getName()]);
				if ($new_status === 'disabled') {
					FlashMessages::addMessage(I18N::translate('The module “%s” has been disabled.', $module->getTitle()), 'success');
				} else {
					FlashMessages::addMessage(I18N::translate('The module “%s” has been enabled.', $module->getTitle()), 'success');
				}
			}
		}
	}

	header('Location: ' . WT_BASE_URL . 'admin_modules.php');

	return;
}

if (Filter::post('action') === 'delete' && Filter::checkCsrf()) {
	$module_name = Filter::post('module_name');
	Database::prepare(
		"DELETE `##block_setting`" .
		" FROM `##block_setting`" .
		" JOIN `##block` USING (block_id)" .
		" JOIN `##module` USING (module_name)" .
		" WHERE module_name=?"
	)->execute([$module_name]);
	Database::prepare(
		"DELETE `##block`" .
		" FROM `##block`" .
		" JOIN `##module` USING (module_name)" .
		" WHERE module_name=?"
	)->execute([$module_name]);
	Database::prepare("DELETE FROM `##module_setting` WHERE module_name=?")->execute([$module_name]);
	Database::prepare("DELETE FROM `##module_privacy` WHERE module_name=?")->execute([$module_name]);
	Database::prepare("DELETE FROM `##module` WHERE module_name=?")->execute([$module_name]);

	FlashMessages::addMessage(I18N::translate('The preferences for the module “%s” have been deleted.', $module_name), 'success');

	header('Location: ' . WT_BASE_URL . 'admin_modules.php');

	return;
}

// The module can’t be found on disk?
// Don't delete it automatically. It may be temporarily missing, after a re-installation, etc.
foreach ($module_status as $module_name => $status) {
	if (!array_key_exists($module_name, $modules)) {
		$html =
			I18N::translate('Preferences exist for the module “%s”, but this module no longer exists.', '<span dir="ltr">' . $module_name . '</span>') .
			'<form method="post" class="form-inline">' .
			Filter::getCsrf() .
			'<input type="hidden" name="action" value="delete">' .
			'<input type="hidden" name="module_name" value="' . $module_name . '">' .
			'<button type="submit" class="btn btn-link">' . I18N::translate('Delete the preferences for this module.') . '</button>' .
			'</form>';
		FlashMessages::addMessage($html, 'warning');
	}
}

$controller
	->pageHeader()
	->addExternalJavascript(WT_JQUERY_DATATABLES_JS_URL)
	->addExternalJavascript(WT_DATATABLES_BOOTSTRAP_JS_URL)
	->addInlineJavascript('
		function reindexMods(id) {
			jQuery("#" + id + " input").each(
				function (index, value) {
					value.value = index+1;
				});
		}
		jQuery("#installed_table").dataTable( {
			paging: false,
			' . I18N::datatablesI18N() . ',
			sorting: [[ 1, "asc" ]],
			columns : [
				{ sortable: false, class: "center" },
				null,
				null,
				{ class: "center" },
				{ class: "center" },
				{ class: "center" },
				{ class: "center" },
				{ class: "center" },
				{ class: "center" },
				{ class: "center", visible: false } // The Module system does not yet include themes
			]
		});
	');

?>
<ol class="breadcrumb small">
	<li><a href="admin.php"><?php echo I18N::translate('Control panel'); ?></a></li>
	<li class="active"><?php echo $controller->getPageTitle(); ?></li>
</ol>

<h1><?php echo $controller->getPageTitle(); ?></h1>

<form method="post" action="<?php echo WT_SCRIPT_NAME; ?>">
	<input type="hidden" name="action" value="update_mods">
	<?php echo Filter::getCsrf(); ?>
	<table class="table table-bordered table-hover table-condensed table-module-administration">
		<caption class="sr-only">
			<?php echo I18N::translate('Module administration'); ?>
		</caption>
		<thead>
		<tr>
			<th><?php echo I18N::translate('Enabled'); ?></th>
			<th><?php echo I18N::translate('Module'); ?></th>
			<th><?php echo I18N::translate('Description'); ?></th>
			<th class="hidden-xs"><a href="admin_module_menus.php"><?php echo I18N::translate('Menus'); ?></a></th>
			<th class="hidden-xs"><a href="admin_module_tabs.php"><?php echo I18N::translate('Tabs'); ?></a></th>
			<th class="hidden-xs"><a href="admin_module_sidebar.php"><?php echo I18N::translate('Sidebars'); ?></a></th>
			<th class="hidden-xs"><a href="admin_module_blocks.php"><?php echo I18N::translate('Blocks'); ?></a></th>
			<th class="hidden-xs"><a href="admin_module_charts.php"><?php echo I18N::translate('Charts'); ?></a></th>
			<th class="hidden-xs"><a href="admin_module_reports.php"><?php echo I18N::translate('Reports'); ?></a></th>
			<th class="hidden"><?php echo I18N::translate('Themes'); ?></th>
		</tr>
		</thead>
		<tbody>
			<?php foreach ($modules as $module_name => $module): ?>
				<tr>
					<td class="text-center">
						<?php echo FunctionsEdit::twoStateCheckbox('status-' . $module->getName(), $module_status[$module_name] === 'enabled') ?>
					</td>
					<td>
						<?php if ($module instanceof ModuleConfigInterface): ?>
							<a href="<?php echo $module->getConfigLink() ?>">
								<?php echo $module->getTitle() ?> <i class="fa fa-cogs"></i>
							</a>
						<?php else: ?>
							<?php echo $module->getTitle() ?>
						<?php endif; ?>
						<?php if (!in_array($module->getName(), Module::getCoreModuleNames())): ?>
							<br>
						<?php endif; ?>
					</td>
					<td>
						<?php echo '', $module->getDescription() ?>
						<?php if (!in_array($module->getName(), Module::getCoreModuleNames())): ?>
							<br>
							<i class="fa fa-asterisk"></i>
							<?php echo I18N::translate('Custom module') ?>
							<?php if ($module::CUSTOM_VERSION): ?>
								- <?php echo I18N::translate('Version') ?> <?php echo $module::CUSTOM_VERSION ?>
							<?php endif; ?>
							<?php if ($module::CUSTOM_WEBSITE): ?>
								- <a href="<?php echo $module::CUSTOM_WEBSITE ?>">
									<?php echo $module::CUSTOM_WEBSITE ?>
								</a>
							<?php endif; ?>
						<?php endif; ?>
					</td>
					<td class="text-center text-muted hidden-xs">
						<?php if ($module instanceof ModuleMenuInterface): ?>
							<i class="fa fa-list-ul" title="<?php echo I18N::translate('Menu') ?>"></i>
						<?php else: ?>
							-
						<?php endif; ?>
					</td>
					<td class="text-center text-muted hidden-xs">
						<?php if ($module instanceof ModuleTabInterface): ?>
							<i class="fa fa-folder" title="<?php echo I18N::translate('Tab') ?>"></i>
						<?php else: ?>
							-
						<?php endif; ?>
					</td>
					<td class="text-center text-muted hidden-xs">
						<?php if ($module instanceof ModuleSidebarInterface): ?>
							<i class="fa fa-th-large" title="<?php echo I18N::translate('Sidebar') ?>"></i>
						<?php else: ?>
							-
						<?php endif; ?>
					</td>
					<td class="text-center text-muted hidden-xs">
						<?php if ($module instanceof ModuleBlockInterface): ?>
							<?php if ($module->isUserBlock()): ?>
								<i class="fa fa-user" title="<?php echo I18N::translate('My page') ?>"></i>
							<?php endif; ?>
							<?php if ($module->isUserBlock()): ?>
								<i class="fa fa-tree" title="<?php echo I18N::translate('Home page') ?>"></i>
							<?php endif; ?>
						<?php else: ?>
							-
						<?php endif; ?>
					</td>
					<td class="text-center text-muted hidden-xs">
						<?php if ($module instanceof ModuleChartInterface): ?>
							<i class="fa fa-share-alt" title="<?php echo I18N::translate('Chart') ?>"></i>
						<?php else: ?>
							-
						<?php endif; ?>
					</td>
					<td class="text-center text-muted hidden-xs">
						<?php if ($module instanceof ModuleReportInterface): ?>
							<i class="fa fa-file" title="<?php echo I18N::translate('Report') ?>"></i>
						<?php else: ?>
							-
						<?php endif; ?>
					</td>
					<td class="text-center text-muted hidden">
						<?php if ($module instanceof ModuleThemeInterface): ?>
							<i class="fa fa-check" title="<?php echo I18N::translate('Theme') ?>"></i>
						<?php else: ?>
							-
						<?php endif; ?>
					</td>
				</tr>
			<?php endforeach; ?>
		</tbody>
	</table>
	<button class="btn btn-primary" type="submit">
		<i class="fa fa-check"></i>
		<?php echo I18N::translate('save'); ?></button>
</form>
