<?php
/**
 * eSales Media Analytics extension for OXID
 *
 * @author    Benjamin Roth [benjamin@esales-media.de]
 * @copyright 2015 eSales Media [http://www.esales-media.de]
 */

/**
 * Class es_analytics defines activation events
 */
class es_analytics_ga4_events
{
	// Module fields
	protected static $arrFields = array
	(
//		array('OXFIELD','VARCHAR(4) NOT NULL default \'\'','oxarticles',false),
	);

	// Theme config options
	protected static $arrConfig = array
	(
//		array('sManufacturerThumbnailsize','str','200*200','theme:azure','images'),
	);

	// Float theme config fields
	protected static $_aParseFloat = array();

	/**
	 * Is called on module activation. Checks for database fields and adds them
	 */
	public static function onActivate()
	{

		$iShopId = oxRegistry::getConfig()->getShopId();
		$oConfig = oxRegistry::getConfig();

		$sDb_name = $oConfig->getConfigParam('dbName');

		// SQL patterns
		$sCheckSQL = "SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = '%s' AND COLUMN_NAME = '%s'";
		$sAddSQL = "ALTER TABLE `%s` ADD `%s` %s";


		// Check and create fields
		$blnDbAltered = false;
		foreach (self::$arrFields as $field)
		{
			if ($field[3])
			{
				$arrFieldVariants = array('','_1','_2','_3');
			} else {
				$arrFieldVariants = array('');
			}

			foreach ($arrFieldVariants as $fieldVariant)
			{
				$rCheck = oxDb::getDb()->getArray(sprintf($sCheckSQL,$field[2],$field[0].$fieldVariant),array($sDb_name));

				if (!count($rCheck))
				{
					$blnDbAltered = true;
					oxDb::getDb()->Execute(sprintf($sAddSQL,$field[2],$field[0].$fieldVariant,$field[1]));
				}
			}
		}

		// Check and create config fields
		foreach (self::$arrConfig as $conf)
		{
			if (!$oConfig->getConfigParam($conf[0]))
			{
				$oConfig->saveShopConfVar($conf[1],$conf[0],self::_serializeConfVar($conf[1],$conf[0],$conf[2]),$iShopId,$conf[3]);

				$sOxId = oxUtilsObject::getInstance()->generateUId();
				$iPosition = oxDb::getDb()->getOne("SELECT MAX(`OXPOS`)+1 FROM oxconfigdisplay WHERE `OXCFGMODULE` = " . oxDb::getDb()->quote($conf[3]) . " AND `OXGROUPING` = " . oxDb::getDb()->quote($conf[4]));
				$sInsertSql = "INSERT INTO `oxconfigdisplay` (`OXID`, `OXCFGMODULE`, `OXCFGVARNAME`, `OXGROUPING`,  `OXPOS`) " .
				              "VALUES ('{$sOxId}', " . oxDb::getDb()->quote($conf[3]) . ", " . oxDb::getDb()->quote($conf[0]) . ", " . oxDb::getDb()->quote($conf[4]) . ", " . oxDb::getDb()->quote($iPosition) . ")";
				oxDb::getDb()->execute($sInsertSql);
			}
		}

		if ($blnDbAltered)
		{
			$oMetaData = oxNew('oxDbMetaDataHandler');
			$oMetaData->updateViews();
		}

	}

	public static function onDeactivate()
	{
		$iShopId = oxRegistry::getConfig()->getShopId();
		$oConfig = oxRegistry::getConfig();

		if ($oConfig->getConfigParam('blOxEsAnalyticsGA4Sweep'))
		{
			$sDb_name = $oConfig->getConfigParam('dbName');

			// SQL patterns
			$sCheckSQL = "SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = '%s' AND COLUMN_NAME = '%s'";
			$sDelSQL = "ALTER TABLE `%s` DROP COLUMN `%s`";


			// Check and delete fields
			$blnDbAltered = false;
			foreach (self::$arrFields as $field)
			{
				if ($field[3])
				{
					$arrFieldVariants = array('', '_1', '_2', '_3');
				} else
				{
					$arrFieldVariants = array('');
				}

				foreach ($arrFieldVariants as $fieldVariant)
				{
					$rCheck = oxDb::getDb()->getArray(sprintf($sCheckSQL, $field[2], $field[0] . $fieldVariant), array($sDb_name));

					if (count($rCheck))
					{
						$blnDbAltered = true;
						oxDb::getDb()->Execute(sprintf($sDelSQL, $field[2], $field[0] . $fieldVariant));
					}
				}
			}



			if ($blnDbAltered)
			{
				$oMetaData = oxNew('oxDbMetaDataHandler');
				$oMetaData->updateViews();
			}

			$oConfig->saveShopConfVar('bool','blOxEsAnalyticsGA4Sweep','false',$iShopId,'module:es:analytics:ga4');

		}
		// Check and delete config fields
		foreach (self::$arrConfig as $conf)
		{
			if ($oConfig->getConfigParam($conf[0]))
			{
				// SQL patterns
				$sDelConfSql = "DELETE FROM `oxconfigdisplay` WHERE OXCFGMODULE=" . oxDb::getDb()->quote($conf[3]) . " AND OXCFGVARNAME=" . oxDb::getDb()->quote($conf[0]);
				oxDb::getDb()->Execute($sDelConfSql);
				$sDelConfSql = "DELETE FROM `oxconfig` WHERE OXMODULE=" . oxDb::getDb()->quote($conf[3]) . " AND OXVARNAME=" . oxDb::getDb()->quote($conf[0]);
				oxDb::getDb()->Execute($sDelConfSql);
			}
		}
	}

	protected static function _serializeConfVar($sType, $sName, $mValue)
	{
		$sData = $mValue;

		switch ($sType) {
			case "bool":
				break;

			case "str":
			case "select":
			case "int":
				if (in_array($sName, self::$_aParseFloat)) {
					$sData = str_replace(',', '.', $sData);
				}
				break;

			case "arr":
				if (!is_array($mValue)) {
					$sData = self::_multilineToArray($mValue);
				}
				break;

			case "aarr":
				$sData = self::_multilineToAarray($mValue);
				break;
		}

		return $sData;
	}

	protected static function _multilineToArray($sMultiline)
	{
		$aArr = explode("\n", $sMultiline);
		if (is_array($aArr)) {
			foreach ($aArr as $sKey => $sVal) {
				$aArr[$sKey] = trim($sVal);
				if ($aArr[$sKey] == "") {
					unset($aArr[$sKey]);
				}
			}

			return $aArr;
		}
	}

	protected static function _multilineToAarray($sMultiline)
	{
		$oStr = getStr();
		$aArr = array();
		$aLines = explode("\n", $sMultiline);
		foreach ($aLines as $sLine) {
			$sLine = trim($sLine);
			if ($sLine != "" && $oStr->preg_match("/(.+)=>(.+)/", $sLine, $aRegs)) {
				$sKey = trim($aRegs[1]);
				$sVal = trim($aRegs[2]);
				if ($sKey != "" && $sVal != "") {
					$aArr[$sKey] = $sVal;
				}
			}
		}

		return $aArr;
	}
}