<?php

defined('HOSTCMS') || exit('HostCMS: access denied.');

/**
 * Install.
 *
 * @package HostCMS 6\Install
 * @version 6.x
 * @author Hostmake LLC
 * @copyright © 2005-2013 ООО "Хостмэйк" (Hostmake LLC), http://www.hostcms.ru
 */
class Install_Controller
{
	/**
	 * The singleton instances.
	 * @var mixed
	 */
	static public $instance = NULL;

	/**
	 * Register an existing instance as a singleton.
	 * @return object
	 */
	static public function instance()
	{
		if (is_null(self::$instance))
		{
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Template path
	 * @var string
	 */
	protected $_sTemplatePath = null;

	/**
	 * Get template path
	 * @return string
	 */
	function getTemplatePath()
	{
		return $this->_sTemplatePath;
	}

	/**
	 * Set template path
	 * @param string $_sTemplatePath path
	 * @return self
	 */
	function setTemplatePath($_sTemplatePath)
	{
		$this->_sTemplatePath = $_sTemplatePath;
		return $this;
	}

	/**
	 * Replace macroses in file
	 * @param string $str file path
	 * @param array $aReplace list of macroses
	 * @return string
	 */
	function macroReplace($str, $aReplace)
	{
		if (count($aReplace) > 0)
		{
			foreach ($aReplace as $key => $value)
			{
				$str = str_replace($key, $value, $str);
			}
		}

		return $str;
	}

	/**
	 * Replace macroses in file
	 * @param string $filename file path
	 * @param array $aReplace list of macroses
	 * @return string
	 */
	function loadFile($filename, $aReplace = array())
	{
		$filecontent = file_get_contents($filename);

		if ($filecontent && count($aReplace) > 0)
		{
			$filecontent = $this->macroReplace($filecontent, $aReplace);
		}

		return $filecontent;
	}

	/**
	 * Replace macroses in file
	 * @param string $filename file path
	 * @param array $aReplace list of macroses
	 */
	function replaceFile($filename, $aReplace = array())
	{
		$filecontent = $this->loadFile($filename, $aReplace);
		file_put_contents($filename, $filecontent);
	}

	/**
	* Определение расширения файла по его названию без расширения
	*
	* @param $path_file_without_extension - путь к файлу без расширения
	*/
	function getFileExtension($path_file_without_extension)
	{
		clearstatcache();

		// Директория, в которой находится файл
		$dirname = dirname($path_file_without_extension);

		// Имя файла
		$filename = basename($path_file_without_extension);

		$extension = '';

		if (is_dir($dirname) && !is_link($dirname) && $handle = @opendir($dirname))
		{
			// Шаблон сравнения
			$str = "/^{$filename}.([a-zA-Z]*)$/";

			// Просматриваем файлы директории
			while (FALSE !== ($file = readdir($handle)))
			{
				if (preg_match($str, $file , $regs) && isset($regs[1]) && $regs[1] != '' )
				{
					$extension = $regs[1];
					break;
				}
			}
			closedir($handle);

			return $extension;
		}
	}

	 /**
	 * Копирование изображений для ИЭ
	 *
	 * @param $targetInformationsystemItemId - идентификатор нового созданого ИЭ
	 * @param $sourceInformationsystemId - идентификатор копируемой ИС
	 * @param $sourceInformationsystemItemId - идентификатор копируемого ИЭ
	 */
	function moveInformationsystemItemImage($targetInformationsystemItemId, $sourceInformationsystemId, $sourceInformationsystemItemId)
	{
		$oInformationsystem_Item = Core_Entity::factory('Informationsystem_Item', $targetInformationsystemItemId);

		// Путь к директории хранения файлов информационного элемента
		$item_dir = $oInformationsystem_Item->getItemPath();

		$information_item_image_from = $this->getTemplatePath() . "tmp/upload/information_system_{$sourceInformationsystemId}/" . Core_File::getNestingDirPath($sourceInformationsystemItemId, 3) . "/item_{$sourceInformationsystemItemId}/information_items_{$sourceInformationsystemItemId}";

		// Получаем расширение файла
		$ext = $this->getFileExtension($information_item_image_from);

		if (!empty($ext))
		{
			$ext = '.' . $ext;
		}
		$information_item_image_from .= $ext;

		if (is_file($information_item_image_from))
		{
			$information_item_image_to = $item_dir . "information_items_{$targetInformationsystemItemId}" . $ext;
 			Core_File::copy($information_item_image_from, $information_item_image_to);

			$oInformationsystem_Item->image_large = basename($information_item_image_to);

			$aImageSize = Core_Image::instance()->getImageSize($information_item_image_to);
			if ($aImageSize)
			{
				$oInformationsystem_Item->image_large_width = $aImageSize['width'];
				$oInformationsystem_Item->image_large_height = $aImageSize['height'];
			}
		}

		$information_item_small_image_from = $this->getTemplatePath() . "tmp/upload/information_system_{$sourceInformationsystemId}/" . Core_File::getNestingDirPath($sourceInformationsystemItemId, 3) . "/item_{$sourceInformationsystemItemId}/small_information_items_{$sourceInformationsystemItemId}";

		// Получаем расширение файла
		$ext = $this->getFileExtension($information_item_small_image_from);

		if (!empty($ext))
		{
			$ext = '.' . $ext;
		}

		$information_item_small_image_from .= $ext;

		if (is_file($information_item_small_image_from))
		{
			$information_item_small_image_to = $item_dir . "small_information_items_{$targetInformationsystemItemId}" . $ext;
			Core_File::copy($information_item_small_image_from, $information_item_small_image_to);

			$oInformationsystem_Item->image_small = basename($information_item_small_image_to);

			$aImageSize = Core_Image::instance()->getImageSize($information_item_small_image_to);
			if ($aImageSize)
			{
				$oInformationsystem_Item->image_small_width = $aImageSize['width'];
				$oInformationsystem_Item->image_small_height = $aImageSize['height'];
			}
		}

		$oInformationsystem_Item->save();
	}

	 /**
	 * Копирование изображений для ИГ
	 *
	 * @param $targetInformationsystemGroupId - идентификатор новой созданной ИГ
	 * @param $sourceInformationsystemId - идентификатор копирумой ИС
	 * @param $sourceInformationsystemGroupId - идентификатор копируемой ИГ
	 */
	function moveInformationsystemGroupImage($targetInformationsystemGroupId, $sourceInformationsystemId, $sourceInformationsystemGroupId)
	{
		//$InformationSystem = & singleton('InformationSystem');

		$oInformationsystem_Group = Core_Entity::factory('Informationsystem_Group', $targetInformationsystemGroupId);

		// Путь к директории хранения файлов информационной группы
		$group_dir = $oInformationsystem_Group->getGroupPath();

		$information_group_image_from = $this->getTemplatePath() . "tmp/upload/information_system_{$sourceInformationsystemId}/" . Core_File::getNestingDirPath($sourceInformationsystemGroupId, 3) . "/group_{$sourceInformationsystemGroupId}/information_groups_{$sourceInformationsystemGroupId}";

		// Получаем расширение файла
		$ext = $this->getFileExtension($information_group_image_from);

		if (!empty($ext))
		{
			$ext = '.' . $ext;
		}
		$information_group_image_from .= $ext;

		if (is_file($information_group_image_from))
		{
			$information_group_image_to = $group_dir . "information_groups_{$targetInformationsystemGroupId}" . $ext;

 			Core_File::copy($information_group_image_from, $information_group_image_to);

			//$param_item['information_items_image'] = basename($information_item_image_to);
			$oInformationsystem_Group->image_large = basename($information_group_image_to);

		}

		$information_group_small_image_from = $this->getTemplatePath() . "tmp/upload/information_system_{$sourceInformationsystemId}/" . Core_File::getNestingDirPath($sourceInformationsystemGroupId, 3) . "/group_{$sourceInformationsystemGroupId}/small_information_groups_{$sourceInformationsystemGroupId}";

		// Получаем расширение файла
		$ext = $this->getFileExtension($information_group_small_image_from);

		if (!empty($ext))
		{
			$ext = '.' . $ext;
		}
		$information_group_small_image_from .= $ext;

		if (is_file($information_group_small_image_from))
		{
			$information_group_small_image_to = $group_dir . "small_information_groups_{$targetInformationsystemGroupId}" . $ext;
			Core_File::copy($information_group_small_image_from, $information_group_small_image_to);

			$oInformationsystem_Group->image_small = basename($information_group_small_image_to);
		}

		$oInformationsystem_Group->save();
	}


	/**
	 * Копирование изображений для доп. свойств ИЭ
	 *
	 * @param $informationsystemItemId - Идентификатор нового ИЭ
	 * @param $informationsystemItemPropertyId - Идентификатор нового доп. свойства типа "Файл"
	 * @param $copyInformationsystemId - Идентификатор копирумой ИС
	 * @param $copyInformationsystemItemId - Идентификатор копируемого ИЭ
	 * @param $copyInformationsystemPropertyValueId - Идентификатор значения доп. свойства типа "Файл" копируемого ИЭ
	 */

	function moveInformationsystemItemPropertyImage($informationsystemItemId, $informationsystemItemPropertyId, $copyInformationsystemId, $copyInformationsystemItemId, $copyInformationsystemPropertyValueId)
	{
		$informationsystemItemId = intval($informationsystemItemId);
		$informationsystemItemPropertyId = intval($informationsystemItemPropertyId);
		$copyInformationsystemId = intval($copyInformationsystemId);
		$copyInformationsystemItemId = intval($copyInformationsystemItemId);
		$copyInformationsystemPropertyValueId = intval($copyInformationsystemPropertyValueId);

		$information_propertys_items_value = '';
		$information_propertys_items_value_small = '';

		$oInformationsystem_Item = Core_Entity::factory('Informationsystem_Item', $informationsystemItemId);

		$item_dir = $oInformationsystem_Item->getItemPath();

		$information_item_property_image_from = $this->getTemplatePath() . "tmp/upload/information_system_{$copyInformationsystemId}/" . Core_File::getNestingDirPath($copyInformationsystemItemId, 3) . "/item_{$copyInformationsystemItemId}/information_items_property_{$copyInformationsystemPropertyValueId}";

		$ext = $this->getFileExtension($information_item_property_image_from);

		if (!empty($ext))
		{
			$ext = '.' . $ext;
		}

		$information_item_property_image_from .= $ext;

		$oProperty = Core_Entity::factory('Property')->find($informationsystemItemPropertyId);
		$oValue = $oProperty->createNewValue($informationsystemItemId);

		if (is_file($information_item_property_image_from))
		{
			$oValue->save();

			$information_item_property_image_to = $item_dir . "information_items_property_" . $oValue->id . $ext;

			Core_File::copy($information_item_property_image_from, $information_item_property_image_to);

			$oValue->file_name = $oValue->file = basename($information_item_property_image_to);
			$oValue->save();
		}

		$information_item_property_small_image_from = $this->getTemplatePath() . "tmp/upload/information_system_{$copyInformationsystemId}/" . Core_File::getNestingDirPath($copyInformationsystemItemId, 3) . "/item_{$copyInformationsystemItemId}/small_information_items_property_{$copyInformationsystemPropertyValueId}";

		if (is_file($information_item_property_small_image_from))
		{
			$oValue->save();

			$information_item_property_small_image_to = $item_dir . "small_information_items_property_" . $oValue->id . $ext;

			Core_File::copy($information_item_property_small_image_from, $information_item_property_small_image_to);

			$oValue->file_small_name = $oValue->file_small = basename($information_item_property_small_image_to);
			$oValue->save();
		}
	}

	 /**
	 * Копирование изображений для магазина
	 *
	 * @param $targetShopItemId - идентификатор нового созданого товара
	 * @param $sourceShopId - идентификатор копируемого магазина
	 * @param $sourceShopItemId - идентификатор копируемого товара
	 */
	function moveShopItemImage($targetShopItemId, $sourceShopId, $sourceShopItemId)
	{
		$oShop_Item = Core_Entity::factory('Shop_Item', $targetShopItemId);

		// Путь к директории хранения файлов товара
		$item_dir = $oShop_Item->getItemPath();

		$shop_item_image_from = $this->getTemplatePath() . "tmp/upload/shop_{$sourceShopId}/" . Core_File::getNestingDirPath($sourceShopItemId, 3) . "/item_{$sourceShopItemId}/shop_items_catalog_image{$sourceShopItemId}";

		// Получаем расширение файла
		$ext = $this->getFileExtension($shop_item_image_from);

		if (!empty($ext))
		{
			$ext = '.' . $ext;
		}
		$shop_item_image_from .= $ext;

		if (is_file($shop_item_image_from))
		{
			$shop_item_image_to = $item_dir . "shop_items_catalog_image{$targetShopItemId}" . $ext;

 			Core_File::copy($shop_item_image_from, $shop_item_image_to);

			$oShop_Item->image_large = basename($shop_item_image_to);

			$aImageSize = Core_Image::instance()->getImageSize($shop_item_image_to);
			if ($aImageSize)
			{
				$oShop_Item->image_large_width = $aImageSize['width'];
				$oShop_Item->image_large_height = $aImageSize['height'];
			}
		}

		$shop_item_small_image_from = $this->getTemplatePath() . "tmp/upload/shop_{$sourceShopId}/" . Core_File::getNestingDirPath($sourceShopItemId, 3) . "/item_{$sourceShopItemId}/small_shop_items_catalog_image{$sourceShopItemId}";

		// Получаем расширение файла
		$ext = $this->getFileExtension($shop_item_small_image_from);

		if (!empty($ext))
		{
			$ext = '.' . $ext;
		}

		$shop_item_small_image_from .= $ext;

		if (is_file($shop_item_small_image_from))
		{
			$shop_item_small_image_to = $item_dir . "small_shop_items_catalog_image{$targetShopItemId}" . $ext;
			Core_File::copy($shop_item_small_image_from, $shop_item_small_image_to);

			$oShop_Item->image_small = basename($shop_item_small_image_to);

			$aImageSize = Core_Image::instance()->getImageSize($shop_item_small_image_to);
			if ($aImageSize)
			{
				$oShop_Item->image_small_width = $aImageSize['width'];
				$oShop_Item->image_small_height = $aImageSize['height'];
			}
		}
		$oShop_Item->save();
	}

	/**
	 * Копирование изображений для группы товаров
	 *
	 * @param int $shopGroupId - идентификатор новой созданной группы магазина
	 * @param int $copyShopId - идентификатор копирумого магазина
	 * @param int $copyGroupId - идентификатор копируемой группы товаров
	 */
	function moveShopGroupImage($shopGroupId, $copyShopId, $copyGroupId)
	{
		$oShop_Group = Core_Entity::factory('Shop_Group', $shopGroupId);
		$group_dir = $oShop_Group->getGroupPath();

		$shop_group_image_from = $this->getTemplatePath() . "tmp/upload/shop_{$copyShopId}/" .  Core_File::getNestingDirPath($copyGroupId, 3) . "/group_{$copyGroupId}/shop_group_image{$copyGroupId}";

		// Получаем расширение файла
		$ext = $this->getFileExtension($shop_group_image_from);

		if (!empty($ext))
		{
			$ext = '.' . $ext;
		}
		$shop_group_image_from .= $ext;

		if (is_file($shop_group_image_from))
		{
			$shop_group_image_to = $group_dir . "shop_group_image{$shopGroupId}" . $ext;
			Core_File::copy($shop_group_image_from, $shop_group_image_to);

			$aImageSize = Core_Image::instance()->getImageSize($shop_group_image_to);

			if ($aImageSize)
			{
				$oShop_Group->image_large_width = $aImageSize['width'];
				$oShop_Group->image_large_height = $aImageSize['height'];
			}

			$oShop_Group->image_large = basename($shop_group_image_to);
		}

		$shop_group_small_image_from = $this->getTemplatePath() . "tmp/upload/shop_{$copyShopId}/" . Core_File::getNestingDirPath($copyGroupId, 3) . "/group_{$copyGroupId}/small_shop_group_image{$copyGroupId}";

		// Получаем расширение файла
		$ext = $this->getFileExtension($shop_group_small_image_from);

		if (!empty($ext))
		{
			$ext = '.' . $ext;
		}
		$shop_group_small_image_from .= $ext;

		if (is_file($shop_group_small_image_from))
		{
			$shop_group_small_image_to = $group_dir . "small_shop_group_image{$shopGroupId}" . $ext;
			Core_File::copy($shop_group_small_image_from, $shop_group_small_image_to);

			$aImageSize = Core_Image::instance()->getImageSize($shop_group_small_image_to);

			if ($aImageSize)
			{
				$oShop_Group->image_small_width = $aImageSize['width'];
				$oShop_Group->image_small_height = $aImageSize['height'];
			}

			$oShop_Group->image_small = basename($shop_group_small_image_to);
		}

		// Обновляем информацию о группе товаров после создания изображений
		$oShop_Group->save();
	}

	/**
	 * Копирование изображений для доп. свойств товара
	 *
	 * @param $shopItemId - идентификатор нового созданого товара
	 * @param $shopItemPropertyId - идентификатор нового созданного доп. свойства
	 * @param $copyShopId - идентификатор копирумого магазина
	 * @param $copyShopItemId - идентификатор копируемого товара
	 * @param $copyShopItemPropertyId - идентификатор доп. свойства типа "Файл" копируемого товара
	 */
	function moveShopItemPropertyImage($shopItemId, $shopItemPropertyId, $copyShopId, $copyShopItemId, $copyShopItemPropertyId)
	{
		$oShop_Item = Core_Entity::factory('Shop_Item', $shopItemId);
		$item_dir = $oShop_Item->getItemPath();

		$shop_item_property_image_from = $this->getTemplatePath() . "tmp/upload/shop_{$copyShopId}/" . Core_File::getNestingDirPath($copyShopItemId, 3) . "/item_{$copyShopItemId}/shop_property_file_{$copyShopItemId}_{$copyShopItemPropertyId}";

		// Получаем расширение файла
		$ext = $this->getFileExtension($shop_item_property_image_from);

		if (!empty($ext))
		{
			$ext = '.' . $ext;
		}
		$shop_item_property_image_from .= $ext;

		$oProperty = Core_Entity::factory('Property')->find($shopItemPropertyId);

		$oValue = $oProperty->createNewValue($shopItemId);

		if (is_file($shop_item_property_image_from))
		{
			$shop_item_property_image_to = $item_dir . "shop_property_file_{$shopItemId}_{$shopItemPropertyId}.jpg";
			Core_File::copy($shop_item_property_image_from, $shop_item_property_image_to);

			$oValue->file_name = $oValue->file = basename($shop_item_property_image_to);
		}

		$shop_item_property_small_image_from = $this->getTemplatePath() . "tmp/upload/shop_{$copyShopId}/" . Core_File::getNestingDirPath($copyShopItemId, 3) . "/item_{$copyShopItemId}/small_shop_property_file_{$copyShopItemId}_{$copyShopItemPropertyId}";

		// Получаем расширение файла
		$ext = $this->getFileExtension($shop_item_property_small_image_from);

		if (!empty($ext))
		{
			$ext = '.' . $ext;
		}

		$shop_item_property_small_image_from .= $ext;

		if (is_file($shop_item_property_small_image_from))
		{
			$shop_item_property_small_image_to = $item_dir . "small_shop_property_file_{$shopItemId}_{$shopItemPropertyId}.jpg";

			Core_File::copy($shop_item_property_small_image_from, $shop_item_property_small_image_to);

			$oValue->file_small_name = $oValue->file_small = basename($shop_item_property_small_image_to);
		}

		$oValue->save();
	}

	/**
	 * Копирование значения доп. свойства типа "Файл" узла структуры
	 *
	 * @param $structureId - Идентификатор нового созданого узла структуры
	 * @param $structurePropertyImageId - Идентификатор нового созданного доп. свойства
	 * @param $copySiteId - Идентификатор сайта, которому принадлежит копируемая структура
	 * @param $copyStructureId - Идентификатор копируемого узла структуры
	 * @param $copyStructurePropertyValueId - Идентификатор значения доп. свойства, значение которого копируется
	 */

	function MoveStructureItemPropertyImage($structureId, $structurePropertyImageId, $copySiteId, $copyStructureId, $copyStructurePropertyValueId)
	{
		$structureId = intval($structureId);
		$structurePropertyImageId = intval($structurePropertyImageId);
		$copySiteId = intval($copySiteId);
		$copyStructureId = intval($copyStructureId);
		$copyStructurePropertyValueId = intval($copyStructurePropertyValueId);

		$oStructure = Core_Entity::factory('Structure', $structureId);

		$file_path_to = '';
		$small_file_path_to = '';

		// Директория с файлами доп. свойств копируемого узла структуры
		$dir_structure_from = "tmp/upload/structure_site_{$copySiteId}/" . Core_File::getNestingDirPath($copyStructureId, 3) . '/structure_' . $copyStructureId . '/';

		if (is_dir($dir_structure_from))
		{
			// Путь к файлу доп. свойства без расширения
			$file_path_from = $this->GetTemplatePath() . $dir_structure_from . 'structure_propertys_image_' . $copyStructurePropertyValueId;

			// Получаем расширение файла
			$ext = $this->getFileExtension($file_path_from);

			if (!empty($ext))
			{
				$ext = '.' . $ext;
			}

			$file_path_from = $file_path_from . $ext;

			// Файл существует
			if (is_file($file_path_from))
			{
				// Вставляем пустое значение доп. свойства
				$oProperty = Core_Entity::factory('Property', $structurePropertyImageId);

				$oValue = $oProperty->createNewValue($structureId);
				$oValue->save();

				$structure_property_value_id = $oValue->id;

				// Имя создаваемого файла
				$file_name_to = 'structure_propertys_image_' . $structure_property_value_id . $ext;

				// Путь к создаваемому файлу
				$file_path_to = $oStructure->getDirPath() . $file_name_to;

				// Копируем файл доп. свойства
				Core_File::copy($file_path_from, $file_path_to);
			}

			// Путь к малому файлу доп. свойства без расширения
			$small_file_path_from = $this->GetTemplatePath() . $dir_structure_from . 'structure_propertys_small_image_' . $copyStructurePropertyValueId;

			// Получаем расширение файла
			$ext = $this->GetFileExtension($small_file_path_from);

			if (!empty($ext))
			{
				$ext = '.' . $ext;
			}

			$small_file_path_from = $small_file_path_from . $ext;

			// Файл существует
			if (is_file($small_file_path_from))
			{
				if (!isset($structure_property_value_id))
				{
					// Вставляем пустое значение доп. свойства
					$oProperty = Core_Entity::factory('Property', $structurePropertyImageId);

					$oValue = $oProperty->createNewValue($structureId);
					$oValue->save();

					$structure_property_value_id = $oValue->id;
				}

				// Имя создаваемого файла
				$small_file_name_to = 'structure_propertys_image_' . $structure_property_value_id . $ext;

				// Путь к создаваемому файлу
				$small_file_path_to = $oStructure->getDirPath() . $small_file_name_to;

				// Копируем файл доп. свойства
				Core_File::copy($small_file_path_from, $small_file_path_to);
			}

			if (isset($structure_property_value_id))
			{
				// Обновляем значение доп. свойства
				$oValue->file = $oValue->file_name = $file_name_to;
				$oValue->file_small = $oValue->file_small_name = $small_file_name_to;

				$oValue->save();
			}
		}
	}
}