<?php

/**
 * @param $_GET['task']
 * @param $_GET['id_mnp']
 * 
 * if $_GET['task'] == 'create_koresp_out'
 *   @require $_GET['id_mnp']
 * 
 * @requires TYPESPECIALS:
 *			[6958] TYPESPECIAL MNP wyślij koresp. link
 *				[6959] PARAM_OUT Wyślij koresp.
 * 							<a href="index.php?MENU_INIT=AHMES_MNP&task=create_koresp_out&id_mnp={ID_MNP}" target="_blank">Wyślij koresp.</a>
 *					[6960] (ALIAS DO [6929]) DANE ID_MNP
 *					[6961] (ALIAS DO [6962]) PARAM_IN ADD_KORESP_OUT_LINK in MNP
 * 
 */
function AHMES_MNP() {
	Lib::loadClass('ProcesHelper');
	$tblMnpId = ProcesHelper::getZasobTableID('MNP');
	$tblKorespId   = ProcesHelper::getZasobTableID('IN7_DZIENNIK_KORESP');

	Lib::loadClass('ProcesHelper');

	$zasobObj = ProcesHelper::getZasobTableInfo($tblMnpId);
	if (!$zasobObj) {
		echo '<div class="alert alert-error">' . "Zasob TABELA ID={$tblMnpId} nie istnieje" . '</div>';
		//echo UserActivity::showSimpleList();
		return;
	}

	$korespObj = ProcesHelper::getZasobTableInfo($tblKorespId);
	if (!$korespObj) {
		echo '<div class="alert alert-error">' . "Zasob TABELA ID={$tblKorespId} nie istnieje" . '</div>';
		//echo UserActivity::showSimpleList();
		return;
	}

	//UserActivity::add($tblMnpId);

	$userAcl = User::getAcl();
	$userAcl->fetchGroups();

	if (!$userAcl->hasTableAcl($zasobObj->ID)) {
		echo '<div class="alert alert-error">' . "Brak uprawnień do tabeli ID={$zasobObj->ID}" . '</div>';
		//echo UserActivity::showSimpleList();
		return;
	}

	if (!$userAcl->hasTableAcl($korespObj->ID)) {
		echo '<div class="alert alert-error">' . "Brak uprawnień do tabeli Korespondencja (ID={$korespObj->ID})" . '</div>';
		//echo UserActivity::showSimpleList();
		return;
	}

	$tblAcl = $userAcl->getTableAcl($zasobObj->ID);
	$korespAcl = $userAcl->getTableAcl($korespObj->ID);

	$forceTblAclInit = ('1' == V::get('_force', '', $_GET));
	$tblAcl->init($forceTblAclInit);
	$korespAcl->init($forceTblAclInit);

	$module = new Ahmes_Mnp($tblAcl, $korespAcl, $_GET);
	$module->run();
}


class Ahmes_Mnp {

	private $_args = null;
	private $_tbl = null;
	private $_acl = null;
	private $_zasobID = null;
	private $_dataSource = null;
	private $_htmlID = '';

	public function __construct($tblAcl, $korespAcl, $args) {
		$this->_args = $args;
		$this->_tbl = $tblAcl->getName();
		$this->_acl = $tblAcl;
		$this->_korespAcl = $korespAcl;
		$this->_zasobID = $tblAcl->getID();
		Lib::loadClass('Data_Source');
		$this->_dataSource = new Data_Source($tblAcl->getDB());
		$this->_dataSource->setTable($tblAcl->getName());
		$realFieldList = $tblAcl->getRealFieldList();
		$this->_dataSource->setCols($realFieldList);
		$this->_dataSource->setColTypes($tblAcl->getTypes());
		$this->_dataSource->setVirtualCols($tblAcl->getVirtualFieldList());
		$this->_dataSource->setFieldGroupWrite('A_ADM_COMPANY', $tblAcl->hasFieldType('A_ADM_COMPANY'));
		$this->_dataSource->setFieldGroupRead('A_CLASSIFIED', $tblAcl->hasFieldType('A_CLASSIFIED'));
		$this->_dataSource->setAccessFltrAllowed(!$tblAcl->hasSuperAccessPerms());
		$this->_htmlID = 'Ahmes_Mnp';

		$adminFields = array('A_RECORD_CREATE_DATE', 'A_RECORD_CREATE_AUTHOR', 'A_RECORD_UPDATE_DATE', 'A_RECORD_UPDATE_AUTHOR');
		foreach ($adminFields as $vAdmFld) {
			if (!in_array($vAdmFld, $realFieldList) && $tblAcl->hasFieldType($vAdmFld)) {
				$this->_dataSource->addCol($vAdmFld);
			}
		}
	}

	public function run() {
		Lib::loadClass('SE_Layout');
		SE_Layout::menu();
		$task = V::get('task', '', $this->_args);
		switch ($task) {
			case 'create_koresp_out':
				$id_mnp = V::get('id_mnp', '', $this->_args);
				if (!$id_mnp) {
					echo '<div class="alert alert-error">' . "Brak numeru z dziennika pism!" . '</div>';
				} else {
					$this->taskCreateKorespOut($id_mnp);
				}
				break;
			default:
				echo '<div class="alert alert-error">' . "Brak zadania do wykonania!" . '</div>';
		}
	}

	private function renderError($msg) {
		echo '<div class="alert alert-error">' . $msg . '</div>';
	}

	private function getMnp($id_mnp) {
		$db = DB::getDB();
		if (!$db) return false;
		$mnp = $db->get_by_id('MNP', $id_mnp);
		return $mnp;
	}

	private function checkMnp($mnp) {
		return true;
	}

	private function taskCreateKorespOut($id_mnp) {
		$mnp = $this->getMnp($id_mnp);
		if (!$mnp) {
			$this->renderError("Brak dostępu do mnp lub rekord nie istnieje");
			return;
		}

		if (!$this->checkMnp($mnp)) {
			$this->renderError("Mnp nie może zostać użyty");
			return;
		}

		if ('1' == V::get('frm_sent', '', $_POST)) {
			$frmSaved = $this->saveCreateKorespOutForm($mnp, $_POST);
			if ($frmSaved) return;
		}
		$this->renderCreateKorespOutForm($mnp);
	}

	public function renderCreateKorespOutForm($mnp) {
		$DBG = ('1' == V::get('DBG', '', $_REQUEST));

		$forceFilterInit = array();
		foreach ($this->_args as $k => $v) {
			if (strlen($k) > 4 && substr($k, 0, 3) == 'ff_' && !empty($v)) {// force filter prefix
				$fldName = substr($k, 3);
				$forceFilterInit[$fldName] = $v;
			}
		}
		$forceFilterInit['K_TYP_KORESP'] = 'OUT';
		$forceFilterInit['K_DATA_OTRZYMANEJ_KORESP'] = date('Y-m-d');
		$forceFilterInit['K_OD_KOGO'] = $mnp->Klient_name;
		$forceFilterInit['OD_KOGO_ADRES'] = $mnp->Klient_address;

		$fieldsList = $this->_korespAcl->getFields();
		$fieldsList = array_filter($fieldsList, function($vCol) {
			return ($vCol['name'] != 'ID');
		});
		$fieldsList = array_map(function($vCol) {
			$vCol['label'] = (!empty($vCol['label']))? $vCol['label'] : $vCol['name'];
			return $vCol;
		}, $fieldsList);

		$cols = array();
		foreach ($fieldsList as $kID => $vCol) {
			$defaultValue = '';
			if (!empty($forceFilterInit[$vCol['name']])) {
				$defaultValue = $forceFilterInit[$vCol['name']];
			}

			// TODO: read from session cache
			$cols[$kID] = V::get("f{$kID}", $defaultValue, $_POST);
		}

		$mnpFldsList = $this->_acl->getFields();
		$mnpFldsList = array_filter($mnpFldsList, function($fld) {
			$mnpFldsName = array();
			$mnpFldsName[] = 'ID';
			$mnpFldsName[] = 'DataZgloszenia';
			$mnpFldsName[] = 'dla_kogo';
			$mnpFldsName[] = 'Klient_name';
			$mnpFldsName[] = 'Klient_address';
			$mnpFldsName[] = 'Klient_mail';
			$mnpFldsName[] = 'Klient_tel';
			$mnpFldsName[] = 'data_real';
			$mnpFldsName[] = 'uwagi';
			if (in_array($fld['name'], $mnpFldsName)) {
				return true;
			}
			return false;
		});

		Lib::loadClass('SE_Layout');
		?>
		<div class="container AjaxFrmHorizontalEdit">
		<form class="form-horizontal" action="" method="post">
			<input type="hidden" name="frm_sent" value="1">
			<fieldset>
				<legend>Dodaj korespondencję na podstawie MNP nr <?php echo $mnp->ID; ?></legend>

				<blockquote>
					<?php foreach ($mnpFldsList as $fldId => $vFld) : ?>
						<p><small><b><?php echo $vFld['label']; ?>: </b> <?php echo $mnp->{$vFld['name']}; ?></small></p>
					<?php endforeach; ?>
				</blockquote>
				<?php $tabindex = 0; foreach ($fieldsList as $kID => $vCol) : ?>
					<?php if ($this->_korespAcl->isAllowed($kID, 'C')) : ?>
						<div class="control-group">
							<label class="control-label" for="<?php echo "f{$kID}"; ?>"><?php echo $vCol['label']; ?>
								<i class="icon-info-sign frm-help" data-toggle="popover" data-trigger="hover" title="" data-content="<?php echo htmlspecialchars($vCol['opis']); ?>" data-original-title="<?php echo "[{$kID}] {$vCol['name']}"; ?>"></i>
								<?php $perms = $this->_korespAcl->getFieldPerms($kID); SE_Layout::hotKeyDBG($perms); ?>
							</label>
							<div class="controls">
								<?php
									$fieldParams = array('appendBack'=>true, 'tabindex'=>(++$tabindex), 'maxGrid'=>8);
									echo $this->_korespAcl->showFormItem('C', $kID, "f{$kID}", $cols[$kID], $fieldParams);
								?>
							</div>
						</div>
					<?php endif; ?>
				<?php endforeach; ?>

				<div class="control-group">
					<div class="controls">
						<button type="submit" class="btn btn-primary" tabindex="<?php echo (++$tabindex); ?>">Dodaj rekord</button>
					</div>
				</div>

			</fieldset>
		</form>
		</div>

<script>
jQuery(document).ready(function(){
	jQuery('textarea').autosize();

	jQuery('.frm-help').popover({trigger:'hover'});
});
</script>
		<?php
	}

	public function saveCreateKorespOutForm($mnp, $args) {
		$DBG = ('1' == V::get('DBG', '', $_REQUEST));

		if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">TODO: save('.$mnp->ID.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($args);echo'</pre>';}
		if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">acl (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($this->_korespAcl);echo'</pre>';}
		$dbID = $this->_korespAcl->getDB();
		$db = DB::getDB($dbID);

		if (!$db) return false;

		$tblName = $this->_korespAcl->getName();

		$sqlObj = new stdClass();
		$fields = $this->_korespAcl->getFields();
		if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">fields (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($fields);echo'</pre>';}
		foreach ($fields as $kID => $vField) {
			if (!$this->_korespAcl->isAllowed($kID, 'C')) {
				continue;
			}
			if (array_key_exists("f{$kID}", $args)) {
				$sqlObj->{$vField['name']} = $args["f{$kID}"];

				if (empty($args["f{$kID}"]) && strlen($args["f{$kID}"]) == 0) {// fix bug in input type date and value="0000-00-00"
					$sqlObj->{$vField['name']} = $this->_korespAcl->fixEmptyValueFromUser($kID);
				}
			}
		}
		if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;"> (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($sqlObj);echo'</pre>';}

		$retID = $db->ADD_NEW_OBJ($tblName, $sqlObj);

		if ($retID > 0) {
			?>
			<div class="alert alert-success">
				Utworzono pomyślnie rekord Nr <?php echo $retID; ?>
			</div>
			<?php
			return true;
		}

		?>
		<div class="alert alert-error">
			Wystąpił błąd podczas tworzenia rekordu
			<?php
			if ($db->has_errors()) {
				$outArr = array();
				$errorsSql = $db->get_errors();
				foreach ($errorsSql as $vErr) {
					if (substr($vErr, 0, 18) == 'SQL QUERY FAILED: ') {
						$vErr = substr($vErr, 18);
						// Duplicate entry '123456-1' for key 'P_NIP'
						if (substr($vErr, 0, 16) == 'Duplicate entry ') {
						}
					}
					$outArr[] = $vErr;
				}
				echo implode('<br>', $outArr);
			}
			?>
		</div>
		<?php
		return false;
	}

	public function ___sendAjaxCreateSave($args) {
		header("Content-type: application/json");
		$DBG = ('1' == V::get('DBG', '', $_REQUEST));
		sleep(1);// TODO: RMME DBG loading

		if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">TODO: save ID(' . $id . ') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($args);echo'</pre>';}
		if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">acl (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($this->_acl);echo'</pre>';}
		$dbID = $this->_acl->getDB();
		$db = DB::getDB($dbID);

		if (!$db) {
			header('HTTP/1.0 406 Not Acceptable');
			echo '{"type":"ERROR", "msg": "' . "Błąd połączenia z bazą danych!" . '"}';
			exit;
		}

		$tblName = $this->_acl->getName();

		$sqlObj = new stdClass();
		$fields = $this->_acl->getFields();
		if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">fields (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($fields);echo'</pre>';}
		foreach ($fields as $kID => $vField) {
			if (!$this->_acl->isAllowed($kID, 'C')) {
				continue;
			}
			if (array_key_exists("f{$kID}", $args)) {
				$sqlObj->{$vField['name']} = $args["f{$kID}"];

				if (empty($args["f{$kID}"]) && strlen($args["f{$kID}"]) == 0) {// fix bug in input type date and value="0000-00-00"
					$sqlObj->{$vField['name']} = $this->_acl->fixEmptyValueFromUser($kID);
				}
			}
		}
		if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;"> (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($sqlObj);echo'</pre>';}

		$retID = $db->ADD_NEW_OBJ($tblName, $sqlObj);

		$retJson = new stdClass();
		$retJson->type = '';
		$retJson->msg = '';

		if ($retID > 0) {
			$retJson->type = 'SUCCESS';
			$retJson->msg = "Utworzono pomyślnie rekord: ID = {$retID}";
			$retJson->id = $retID;
		} else {
			header('HTTP/1.0 404 Not Found');
			$retJson->type = 'ERROR';
			$retJson->msg = "";
			if ($db->has_errors()) {
				$outArr = array();
				$errorsSql = $db->get_errors();
				foreach ($errorsSql as $vErr) {
					if (substr($vErr, 0, 18) == 'SQL QUERY FAILED: ') {
						$vErr = substr($vErr, 18);
						// Duplicate entry '123456-1' for key 'P_NIP'
						if (substr($vErr, 0, 16) == 'Duplicate entry ') {
						}
					}
					$outArr[] = $vErr;
				}
				$retJson->msg .= implode('<br>', $outArr);
			}
		}

		echo json_encode($retJson);
		exit;
	}

}
