<?php
/* ============================ */
/*         SalesMan CRM         */
/* ============================ */
/* (C) 2016 Vladislav Andreev   */
/*       SalesMan Project       */
/*        www.isaler.ru         */
/*        ver. 2019.x           */
/* ============================ */

error_reporting( E_ERROR );
ini_set('display_errors', 1);

header( "Pragma: no-cache" );

global $hooks;

const SMPLUGIN = true;

$rootpath = dirname( __DIR__, 2 );

include $rootpath."/inc/config.php";
include $rootpath."/inc/dbconnector.php";
include $rootpath."/inc/auth.php";
include $rootpath."/inc/func.php";
include $rootpath."/inc/settings.php";
// Доступ только для администратора
if ($isadmin != 'on' && $tipuser != 'Администратор') {
	print 'Доступ запрещен';
	exit();
}


$thisfile = basename( __FILE__ );

$pluginList       = json_decode( str_replace( [
	"  ",
	"\t",
	"\n",
	"\r"
], "", file_get_contents( $rootpath."/plugins/map.json" ) ), true );
$pluginListCastom = (file_exists( $rootpath."/plugins/map.castom.json" )) ? json_decode( str_replace( [
	"  ",
	"\t",
	"\n",
	"\r"
], "", file_get_contents( $rootpath."/plugins/map.castom.json" ) ), true ) : [];

$pluginList = array_merge( $pluginList, $pluginListCastom );

$action = $_REQUEST['action'];

if ( $action == "deactivate" ) {

	$id = $_REQUEST['id'];
	$folder = $_REQUEST['name'];

	// подключаем хук плагина
	/*if ( !empty( $folder ) && file_exists( $rootpath."/plugins/$folder/".strtolower( $folder ).".php" ) ) {
		require_once $rootpath."/plugins/$folder/".strtolower( $folder ).".php";
	}*/

	$db -> query( "UPDATE ".$sqlname."plugins SET ?u WHERE id = '$id' and identity = '$identity'", [
		'active' => 'off',
		'datum'  => current_datumtime()
	] );

	// выполняем хук деактивации
	$hooks -> do_action( 'plugin_deactivate', ["name" => $folder] );

	/**
	 * массив подключенных плагинов
	 * далее используется для публикации в глобальной переменной для js
	 * в файле inc/header.php
	 */
	$pluginEnabled = [];

	$plugin = $db -> query( "SELECT * FROM ".$sqlname."plugins WHERE active = 'on' and identity = '$identity' ORDER by name" );
	while ($data = $db -> fetch( $plugin )) {

		$pluginEnabled[] = $data['name'];

	}

	file_put_contents( $rootpath."/cash/{$fpath}plugins.json", json_encode( $pluginEnabled ) );

	print "Плагин деактивирован";

	exit();

}
if ( $action == "activate" ) {

	$id     = $_REQUEST['id'];
	$folder = $_REQUEST['name'];
	$name = strtolower($_REQUEST['name']);

	//print $rootpath."/plugins/{$folder}/{$name}.php";

	// подключаем хук плагина
	if ( !empty( $folder ) && file_exists( $rootpath."/plugins/{$folder}/{$name}.php" ) ) {
		require_once $rootpath."/plugins/{$folder}/{$name}.php";
	}

	$pluginAbout['version'] = '1.0';
	if ( file_exists( $rootpath."/plugins/{$folder}/plugin.json" ) ) {

		$pluginAbout = json_decode( str_replace( [
			"  ",
			"\t",
			"\n",
			"\r"
		], "", file_get_contents( $rootpath."/plugins/{$folder}/plugin.json" ) ), true );

		//print_r($pluginAbout);

	}

	$db -> query( "UPDATE ".$sqlname."plugins SET ?u WHERE id = '$id' and identity = '$identity'", [
		'active'  => 'on',
		'version' => $pluginAbout['version'],
		'datum'   => current_datumtime()
	] );

	// выполняем хук активации
	$hooks -> do_action( 'plugin_activate', ["name" => $_REQUEST['name']] );

	/**
	 * массив подключенных плагинов
	 * далее используется для публикации в глобальной переменной для js
	 * в файле inc/header.php
	 */
	$pluginEnabled = [];

	$plugin = $db -> query( "SELECT * FROM ".$sqlname."plugins WHERE active = 'on' and identity = '$identity' ORDER by name" );
	while ($data = $db -> fetch( $plugin )) {

		$pluginEnabled[] = $data['name'];

	}

	file_put_contents( $rootpath."/cash/{$fpath}plugins.json", json_encode( $pluginEnabled ) );

	print "Плагин активирован";

	exit();

}
if ( $action == "uninstall" ) {

	$id     = $_REQUEST['id'];
	$folder = $_REQUEST['name'];

	define( 'SM_UNINSTALL_PLUGIN', true );

	// подключаем хук плагина
	if ( !empty( $folder ) && file_exists( $rootpath."/plugins/$folder/uninstall.php" ) ) {
		require_once $rootpath."/plugins/$folder/uninstall.php";
	}

	// выполняем хук деинсталляции
	$hooks -> do_action( 'plugin_uninstall', ["name" => $_REQUEST['name']] );

	$db -> query( "DELETE FROM ".$sqlname."plugins WHERE id = '$id' and identity = '$identity'" );

	/**
	 * массив подключенных плагинов
	 * далее используется для публикации в глобальной переменной для js
	 * в файле inc/header.php
	 */
	$pluginEnabled = [];

	$plugin = $db -> query( "SELECT * FROM ".$sqlname."plugins WHERE active = 'on' and identity = '$identity' ORDER by name" );
	while ($data = $db -> fetch( $plugin )) {

		$pluginEnabled[] = $data['name'];

	}

	file_put_contents( $rootpath."/cash/{$fpath}plugins.json", json_encode( $pluginEnabled ) );

	print "Плагин удален";

	exit();

}
if ( $action == "update" ) {

	$id     = $_REQUEST['id'];
	$folder = $_REQUEST['name'];

	// подключаем хук плагина
	// отключено, т.к. они уже подключены
	/*if ( !empty( $folder ) && file_exists( $rootpath."/plugins/$folder/".strtolower( $folder ).".php" ) ) {
		include_once $rootpath."/plugins/$folder/".strtolower( $folder ).".php";
	}*/

	if ( file_exists( $rootpath."/plugins/$folder/plugin.json" ) ) {

		$pluginAbout = json_decode( str_replace( [
			"  ",
			"\t",
			"\n",
			"\r"
		], "", file_get_contents( $rootpath."/plugins/{$folder}/plugin.json" ) ), true );

	}

	$db -> query( "UPDATE ".$sqlname."plugins SET ?u WHERE id = '$id' and identity = '$identity'", [
		'version' => $pluginAbout['version'],
		'datum'   => current_datumtime()
	] );

	// выполняем хук активации
	$hooks -> do_action( 'plugin_update', ["name" => $folder] );

	print "Плагин обновлен";

}

if ( $action == "install.do" ) {

	$id     = $_REQUEST['id'];
	$folder = $_REQUEST['plugin'];

	$data['name']     = $_REQUEST['plugin'];
	$data['active']   = 'on';
	$data['identity'] = $identity;
	$data['datum']    = current_datumtime();

	$data['version'] = '1.0';
	if ( file_exists( $rootpath."/plugins/{$folder}/plugin.json" ) ) {

		$pluginAbout     = json_decode( str_replace( [
			"  ",
			"\t",
			"\n",
			"\r"
		], "", file_get_contents( $rootpath."/plugins/{$folder}/plugin.json" ) ), true );
		$data['version'] = $pluginAbout['version'];

	}

	$db -> query( "INSERT INTO ".$sqlname."plugins SET ?u", $data );

	// подключаем хук плагина
	if ( isset( $data['name'] ) && file_exists( $rootpath."/plugins/$folder/".strtolower( $data['name'] ).".php" ) ) {
		require_once $rootpath."/plugins/$folder/".strtolower( $data['name'] ).".php";
	}

	// выполняем хук активации
	$hooks -> do_action( 'plugin_activate', ["name" => $data['name']] );

	/**
	 * массив подключенных плагинов
	 * далее используется для публикации в глобальной переменной для js
	 * в файле inc/header.php
	 */
	$pluginEnabled = [];

	$plugin = $db -> query( "SELECT * FROM ".$sqlname."plugins WHERE active = 'on' and identity = '$identity' ORDER by name" );
	while ($data = $db -> fetch( $plugin )) {

		$pluginEnabled[] = $data['name'];

	}

	file_put_contents( $rootpath."/cash/".$fpath."plugins.json", json_encode( $pluginEnabled ) );

	print json_encode_cyr( ["result" => "Сделано"] );

	exit();

}
if ( $action == "install" ) {

	$id = $_REQUEST['id'];

	$pluginsExist = $db -> getCol( "SELECT name FROM ".$sqlname."plugins where identity = '$identity'" );

	// пройдем папку с плагинами
	clearstatcache();

	$folders = scandir( $rootpath."/plugins", 1 );

	$pluginList = [];
	foreach ( $folders as $folder ) {

		if ( !in_array( $folder, [
				".",
				".."
			] ) && file_exists( $rootpath."/plugins/{$folder}/plugin.json" ) && !in_array( $folder, $pluginsExist, true ) ) {

			$pluginAbout = json_decode( str_replace( [
				"  ",
				"\t",
				"\n",
				"\r"
			], "", file_get_contents( $rootpath."/plugins/{$folder}/plugin.json" ) ), true );

			//print_r($pluginAbout);

			//$pluginList[ $pluginAbout['package'] ] = ["name" => $pluginAbout['name']];

			$pluginList[ $pluginAbout['name'] ] = [
				"name" => $pluginAbout['name'],
				"package" => $pluginAbout['package']
			];

		}

	}

	ksort($pluginList);

	?>
	<div class="zagolovok">Добавить Плагин</div>

	<FORM action="/content/admin/<?php echo $thisfile; ?>" method="POST" name="form" id="form">
		<input name="action" id="action" type="hidden" value="install.do"/>

		<div class="row">

			<div class="column12 grid-2 fs-12 pt10 right-text gray2">Плагин:</div>
			<div class="column12 grid-10">
				<select name="plugin" id="plugin" class="wp97">
					<option value="">--выбор--</option>
					<?php
					foreach ( $pluginList as $plugin => $item ) {

						if (
							!in_array( $item['package'], $pluginsExist ) &&
							file_exists( $rootpath."/plugins/".$item['package'] ) &&
							$item['name'] != ''
						) {
							print '<option value="'.$item['package'].'">'.$item['name'].'</option>';
						}

					}
					?>
				</select>
			</div>

		</div>

		<div class="viewdiv">

			<p>Необходимость подключения выбранного плагина к Webhook смотрите в Справке к плагину.</p>

			<?php
			if ( $isCloud ) {
				?>
				<p>После первого подключения плагина вы сможете протестировать его работу в течение 14 календарных дней. По истечению этого срока со счета вашего аккаунта будут списаны средства в виде арендной платы в размере 100 руб. (кроме SMS-плагинов) Списание производится ежемесячно и единовременно</p>
			<?php } ?>

		</div>

	</FORM>

	<hr>

	<div class="button--pane text-right">

		<A href="javascript:void(0)" onclick="$('#form').trigger('submit')" class="button">Сохранить</A>&nbsp;
		<A href="javascript:void(0)" onclick="DClose()" class="button">Отмена</A>

	</div>

	<script>

		$('#dialog').css({'width': '600px'});

		$('#form').ajaxForm({

			dataType: 'json',
			beforeSubmit: function () {

				var $out = $('#message');
				var em = checkRequired();

				if (em === false) return false;

				$out.fadeTo(10, 1).empty();

				$('#dialog').css('display', 'none');
				$('#dialog_container').css('display', 'none');
				$out.css('display', 'block').append('<div id=loader><img src=/assets/images/loader.gif> Загрузка данных. Пожалуйста подождите...</div>');

				return true;

			},
			success: function (data) {

				$('#contentdiv').load('/content/admin/<?php echo $thisfile; ?>');

				$('#message').fadeTo(1, 0);

				Swal.fire({
					icon: 'info',
					imageUrl: '/assets/images/success.svg',
					imageWidth: 50,
					imageHeight: 50,
					title: 'Вроде получилось',
					html: '' + data.result + '',
					showConfirmButton: false,
					timer: 2500
				});

				DClose();

			}

		});

	</script>
	<?php

	exit();

}

if ( $action == 'readme' ){

	$text = file_get_contents($rootpath."/plugins/".$_REQUEST['name']."/readme.md");
	$about = json_decode( str_replace( [
		"  ",
		"\t",
		"\n",
		"\r"
	], "", file_get_contents( $rootpath."/plugins/".$_REQUEST['name']."/plugin.json" ) ), true );

	$Parsedown = new Parsedown();
	$html = $Parsedown -> text( $text );

	$html = str_replace( [
		"{{package}}",
		"{{version}}",
		"{{versiondate}}",
	], [
		$about['package'],
		$about['version'],
		$about['versiondate'],
	], $html );
	?>
	<style>
        .readme blockquote{
            font-size: 0.9em;
            padding: 5px 10px;
            background-color: var(--gray-superlite);
            border: 1px dashed var(--red);
            border-left: 3px solid var(--red);
            margin: 0;
        }
	</style>
	<div class="zagolovok">Readme</div>
	<DIV id="formtabs" class="p20 bgwhite readme" style="overflow-y: auto; overflow-x:hidden; max-height:80vh;">

		<?php print $html; ?>

	</DIV>

	<hr>

	<div class="button--pane text-right">

		<a href="javascript:void(0)" onclick="DClose()" class="button">Закрыть</a>

	</div>
	<script>

		$(function () {
			$('#dialog').css('width', '70vw').center();
		});

	</script>
	<?php
	exit();
}

if ( $action == '' ) {

	$list        = [];
	$updateCount = 0;
	$updateName  = [];
	$i           = 1;
	$result      = $db -> getAll( "SELECT * FROM ".$sqlname."plugins WHERE identity = '$identity' ORDER BY name" );

	//print_r($result);

	foreach ( $result as $data ) {

		$pluginAbout = [];
		$actions = $about = $package = '';

		$img = ($pluginList[ $data['name'] ]['icon'] != '') ? '<div class="mt10 mr10 mb10 fs-20 pl10"><i class="'.$pluginList[ $data['name'] ]['icon'].' gray2"></i></div>' : '<img src="data:image/svg+xml;base64, " class="mt10 icon" width="30" height="30">';

		$color = ($data['active'] == 'on') ? 'blue' : 'gray';
		$a     = ($data['active'] == 'on') ? '' : 'idisabled';

		$doit = ($isCloud == true && (diffDate( $data['datum'] ) == 0 || diffDate( $data['datum'] ) > 14 || $data['active'] == 'off')) || $isCloud == false;
		$diff = (14 - diffDate( $data['datum'] ));

		if ( file_exists( $rootpath."/plugins/".$data['name']."/plugin.json" ) ) {

			$pluginAbout = json_decode( str_replace( [
				"  ",
				"\t",
				"\n",
				"\r"
			], "", file_get_contents( $rootpath."/plugins/".$data['name']."/plugin.json" ) ), true );

			$pluginList[ $data['name'] ]['name']       = $pluginAbout['name'];
			$pluginList[ $data['name'] ]['content']    = $pluginAbout['description'];
			$pluginList[ $data['name'] ]['package']    = $pluginAbout['package'];
			$pluginList[ $data['name'] ]['interfaice'] = $pluginAbout['menu'] ? "yes" : "";

			$img = ($pluginAbout['iconSVGinBase64'] != '') ? '<img src="data:image/svg+xml;base64,'.$pluginAbout['iconSVGinBase64'].'" class="mt10 icon '.$color.'" width="30" height="30">' : '<div class="mt10 mr10 mb10 fs-20 pl10"><i class="'.$pluginAbout['icon'].'"></i></div>';

			$about .= 'Версия: '.$pluginAbout['version'].'&nbsp;|&nbsp;';
			$about .= '<a href="'.$pluginAbout['authorurl'].'" target="_blank"><i class="icon-globe"></i> '.$pluginAbout['author'].'</a>&nbsp;|&nbsp;';
			$about .= '<a href="'.$pluginAbout['link'].'" target="_blank"><i class="icon-link-1"></i> Описание</a>&nbsp;|&nbsp;';
			$about .= (file_exists( $rootpath."/plugins/".$data['name']."/readme.md" )) ? '<a href="javascript:void(0)" onclick="readMe(\''.$data['name'].'\')" class="blue"><i class="icon-book"></i> Readme</a>&nbsp;|&nbsp;' : "";

		}

		if ( is_null( $data['version'] ) && $pluginAbout['version'] != '' ) {

			$db -> query( "UPDATE ".$sqlname."plugins SET ?u WHERE id = '$data[id]' and identity = '$identity'", [
				'version' => $pluginAbout['version']
			] );

			$data['version'] = $pluginAbout['version'];

		}

		if ( $data['active'] == 'on' ) {

			if ( $doit ) {

				if ( $pluginList[ $data['name'] ]['interfaice'] == "yes" ) {

					$actions .= '<A href="javascript:void(0)" onclick="openPlugin(\'plugins/'.$data['name'].'\')" class="blue" title="Настроить">Настроить</A>&nbsp;|&nbsp;';

				}

				$actions .= '<A href="javascript:void(0)" onclick="actPlugin(\''.$data['id'].'\',\'deactivate\', \''.$data['name'].'\')" class="blue" title="Деактивировать">Деактивировать</A>';

			}

			else {
				$actions .= '<A href="javascript:void(0)" class="gray2" title="Плагин может быть деактивирован через '.$diff.' '.getMorph( $diff, 'day' ).'">Деактивировать</A>';
			}

		}
		else {

			$actions .= '<A href="javascript:void(0)" onclick="actPlugin(\''.$data['id'].'\',\'activate\', \''.$data['name'].'\')" class="blue" title="Активировать">Активировать</A>';

			$actions .= '&nbsp;|&nbsp;<A href="javascript:void(0)" onclick="uninstallPlugin(\''.$data['id'].'\',\''.$data['name'].'\')" class="red" title="Удалить">Удалить</A>';

		}

		if ( $data['version'] != $pluginAbout['version'] && $pluginAbout['version'] != '' ) {

			$actions .= '<div class="mt5"><A href="javascript:void(0)" onclick="actPlugin(\''.$data['id'].'\',\'update\', \''.$data['name'].'\')" class="button greenbtn ptb5lr15" title="Обновить"><i class="icon-refresh"></i>Обновить</A></div>Версия в базе: '.$data['version'];

			$updateCount++;
			$updateName[] = $pluginAbout['name'];

		}

		$about .= '<span title="Дата активации"><i class="icon-calendar-inv"></i> '.get_date( $data['datum'] ).'</span>';

		$list[ $pluginList[ $data['name'] ]['name'] ] = [
			"active"  => $a,
			"img"     => $img,
			"name"    => $pluginList[ $data['name'] ]['name'],
			"color"   => $color,
			"actions" => $actions,
			"content" => $pluginList[ $data['name'] ]['content'],
			"package" => $pluginList[ $data['name'] ]['package'],
			"about"   => $about
		];

	}

	ksort( $list );

	?>
	<style>

		.idisabled .icon {
			filter : grayscale(5);
		}
		.idisabled:hover .icon {
			filter : unset;
		}

	</style>
	<h2>&nbsp;Раздел: "Плагины"</h2>

	<div class="viewdiv">

		<p>В этом разделе вы можете подключить имеющиеся плагины</p>
		<p>Плагины <b>НЕ входят в состав SalesMan CRM</b>, поставляются отдельно и их работоспособность не гарантируется в каждом конкретном случае. Список плагинов доступен
			<a href="https://salesman.pro/plugins/" title="SalesMan. Плагины" target="_blank" class="blue">на сайте</a> и в
			<a href="https://salesman.pro/api2/plugins" title="Документации" target="_blank">Документации</a></p>
		<p>После добавления/удаления и активации/деактивации плагина требуется обновить окно браузера</p>

		<?php
		if ( $updateCount > 0 ) {
			print '<div class="success">Следует обновить <b>'.$updateCount.'</b> '.getMorph2( $updateCount, [
					'плагин',
					'плагина',
					'плагинов'
				] ).' - '.yimplode( ", ", $updateName ).'</div>';
		}
		?>

	</div>

	<?php
	if ( $isCloud ) {

		print '<div class="warning p10 fs-11">
			<h2 class="red fs-12 mt5">Внимание!</h2>
			Деактивация некоторых плагинов возможна либо <b>в день активации</b>, либо
			<b>через 14 дней</b> после активации!
		</div>';

	}
	?>

	<hr>

	<TABLE id="catlist" class="top">
		<thead class="hidden-iphone sticked--top">
		<TR class="th40">
			<th class="w60"></th>
			<th class="w300 text-left"><b>Название</b></th>
			<th class="text-left"><b>Описание</b></th>
		</TR>
		</thead>
		<tbody>
		<?php
		foreach ( $list as $data ) {
			?>
			<TR class="ha th45 <?php echo $data['active']; ?>">
				<TD class="text-center">
					<div><?php echo $data['img'] ?></div>
				</TD>
				<TD>
					<div class="Bold <?php echo $data['color'] ?> fs-12 mt10"><?php echo $data['name'] ?></div>
					<?php if ( $data['package'] != '' ) {
						print '<div class="gray2 mt5">'.$data['package'].'</div>';
					} ?>
					<div class="mt10 fs-09 mb10 gray"><?php echo $data['actions']; ?></div>
				</TD>
				<TD>
					<div class="fs-10 mt10 mb5"><?php echo $data['content'] ?></div>
					<div class="mt10 fs-09 mb10"><?php echo $data['about']; ?></div>
				</TD>
			</TR>
			<?php
		}
		?>
		</tbody>
	</TABLE>

	<div style="height: 90px">&nbsp;</div>

	<DIV class="fixAddBotButton" onclick="doLoad('/content/admin/<?php echo $thisfile; ?>?action=install');">
		<i class="icon-plus"></i>Добавить
	</div>

	<script>

		function actPlugin(id, action, name) {

			$('#message').empty().fadeTo(1, 1).css('display', 'block').append('<div id="loader"><img src="/assets/images/loader.gif"> Выполняю...</div>');

			$.get("/content/admin/<?php echo $thisfile; ?>?action=" + action + "&id=" + id + "&name=" + name, function (data) {

				$('#contentdiv').load('/content/admin/<?php echo $thisfile; ?>');

				$('#message').empty().fadeTo(1, 0);//.css('display', 'block').html('Результат: ' + data);

				Swal.fire({
					imageUrl: '/assets/images/congratulation.svg',
					imageWidth: 50,
					imageHeight: 50,
					position: 'bottom-end',
					//background: "var(--blue)",
					//title: '<div class="white fs-11">Вроде получилось</div>',
					html: '' + data + '',
					icon: 'info',
					showConfirmButton: false,
					timer: 3500
				});

			});

		}

		function readMe(name){

			doLoad("/content/admin/<?php echo $thisfile; ?>?action=readme&name=" + name);

		}

		function uninstallPlugin(id, name) {

			Swal.fire({
					title: 'Вы уверены?',
					text: "Будут удалены все данные, собранные плагином и его настройки!",
					type: 'warning',
					showCancelButton: true,
					confirmButtonColor: '#3085D6',
					cancelButtonColor: '#D33',
					confirmButtonText: 'Да, выполнить',
					cancelButtonText: 'Отменить',
					confirmButtonClass: 'greenbtn',
					cancelButtonClass: 'redbtn'
				}
			).then((result) => {

				if (result.value) {

					$('#message').empty().fadeTo(1, 1).css('display', 'block').append('<div id="loader"><img src="/assets/images/loader.gif"> Выполняю...</div>');

					$.get("/content/admin/<?php echo $thisfile; ?>?action=uninstall&id=" + id + "&name=" + name, function (data) {

						$('#contentdiv').load('/content/admin/<?php echo $thisfile; ?>');

						$('#message').empty().fadeTo(1, 0);

						Swal.fire({
							imageUrl: '/assets/images/congratulation.svg',
							imageWidth: 50,
							imageHeight: 50,
							position: 'bottom-end',
							html: '' + data + '',
							icon: 'info',
							showConfirmButton: false,
							timer: 3500
						});

					});

				}

			});

		}

	</script>
<?php } ?>