<?php
/**
 * Система управления сайтом HostCMS v. 5.xx
 * Copyright © 2005-2010 ООО "Хостмэйк" (Hostmake LLC), http://www.hostcms.ru
 *
 * Обработчик создания модификаций из товара.
 *
 * Файл: /admin/shop/action/create_modifications.php
 *
 * @author Hostmake LLC
 * @version 5.x
 */

$shop = & singleton('shop');
$DataBase = & singleton('DataBase');

// Идентификатор группы, в которую следует вернутся после отработки скрипта
$shop_group_id = to_int($_REQUEST['shop_group_id']);

// Идентификатор магазина
$shop_shops_id = to_int($_REQUEST['shop_shops_id']);

// Идентификатор основного товара
$shop_items_catalog_id = to_int($_REQUEST['shop_items_catalog_id']);

$price = to_float($_REQUEST['price']);
$items_catalog_currency = to_int($_REQUEST['items_catalog_currency']);
$items_catalog_mesures = to_int($_REQUEST['items_catalog_mesures']);
$items_catalog_name = to_str($_REQUEST['items_catalog_name']);
$items_catalog_marking = to_str($_REQUEST['items_catalog_marking']);

// Получаем информацию об основном товаре
$item_row = $shop->GetItem($shop_items_catalog_id);

// Ошибка добавления модификаций
$error_flag = true;

// Основной товар существует
if ($item_row)
{
	// Список доп. свойств, по которым необходимо сгенерировать модификации
	$property_array = array ();
	$count = 1;

	if (class_exists('lists'))
	{
		$lists = & singleton('lists');

		$i = 0;

		foreach ($_POST as $value => $key)
		{
			// Существовавшие поля (обновляемые)
			if ((preg_match("'^property_([0-9]+)$'siu", to_str($value), $regs)))
			{
				// Получаем информацию о свойстве
				$property_row = $shop->GetPropretyOfItems(to_int($regs[1]));

				if ($property_row)
				{
					// Если свойство - список
					$list_values = $lists->GetListItemsById(to_int($property_row['lists_id']));

					// Список не пустой
					if (count($list_values))
					{
						// Считаем количество модификаций (числа возможных сочетаний элементов списков)
						$count *= count($list_values);

						// Добавляем идентификатор свойства
						$properties_id_list[$i] = to_int($regs[1]);

						foreach ($list_values as $k => $v)
						{
							// Массив элементов списков
							$property_array[$i][] = $v['lists_items_id'];
							$property_value[$v['lists_items_id']] = $v;
						}

						$i++;
					}
				}
			}
		}
	}

	// Шаг приращения индекса для каждого списка
	$step = array ();

	// Текущий индекс элемента для каждого списка
	$ind = array ();

	// Есть хотя бы один список
	if (isset ($property_array[0]))
	{
		// Ошибок нет.
		$error_flag = false;

		// Формируем массив параметров для вставки модификации
		$param = array ();
		$param['price'] = $price;
		$param['shops_id'] = $shop_shops_id;
		$param['mesures_id'] = $items_catalog_mesures;
		$param['currency_id'] = $items_catalog_currency;
		$param['shop_items_catalog_modification_id'] = $shop_items_catalog_id;
		$param['shop_items_catalog_type'] = to_int($item_row['shop_items_catalog_type']);
		$param['shop_items_catalog_date_time'] = date("Y-m-d H:i:s");
		$param['site_users_id'] = to_int($item_row['site_users_id']);
		// При вставке модификации группа равна 0
		//$param['groups_id'] = to_int($item_row['shop_groups_id']);
		$param['groups_id'] = 0;

		// Копировать основные атрибуты основного товара
		if (isset ($_REQUEST['copy_main_properties']))
		{
			$param['description'] = to_str($item_row['shop_items_catalog_description']);
			$param['text'] = to_str($item_row['shop_items_catalog_text']);
			$param['producers_list_id'] = to_int($item_row['shop_producers_list_id']);
			$param['weight'] = to_float($item_row['shop_items_catalog_weight']);
			$param['shop_sallers_id'] = to_int($item_row['shop_sallers_id']);
			$param['order'] = to_int($item_row['shop_items_catalog_order']);
			$param['is_active'] = to_int($item_row['shop_items_catalog_is_active']);
			$param['indexation'] = to_int($item_row['shop_items_catalog_indexation']);
			$param['tax_id'] = to_int($item_row['shop_tax_id']);
			$param['shop_items_catalog_putoff_date'] = to_str($item_row['shop_items_catalog_putoff_date']);
			$param['shop_items_catalog_putend_date'] = to_str($item_row['shop_items_catalog_putend_date']);
		}

		// Копировать параметры экспорта/импорта
		if (isset ($_REQUEST['copy_export_import']))
		{
			$param['shop_items_catalog_yandex_market_allow'] = to_int($item_row['shop_items_catalog_yandex_market_allow']);
			$param['shop_items_catalog_yandex_market_bid'] = to_int($item_row['shop_items_catalog_yandex_market_bid']);
			$param['shop_items_catalog_yandex_market_cid'] = to_int($item_row['shop_items_catalog_yandex_market_cid']);
			$param['shop_vendorcode'] = to_str($item_row['shop_vendorcode']);
			$param['shop_items_catalog_rambler_pokupki_allow'] = to_int($item_row['shop_items_catalog_rambler_pokupki_allow']);
			$param['shop_items_catalog_yandex_market_sales_notes'] = to_str($item_row['shop_items_catalog_yandex_market_sales_notes']);
			$param['shop_items_cml_id'] = to_str($item_row['shop_items_cml_id']);
		}

		// Копировать seo-поля
		if (isset ($_REQUEST['copy_seo']))
		{
			$param['seo_title'] = to_str($item_row['shop_items_catalog_seo_title']);
			$param['seo_description'] = to_str($item_row['shop_items_catalog_seo_description']);
			$param['seo_keywords'] = to_str($item_row['shop_items_catalog_seo_keywords']);
		}

		// Копировать основные атрибуты основного товара
		if (isset ($_REQUEST['copy_main_properties']) && (to_str($item_row['shop_items_catalog_image']) != '' || to_str($item_row['shop_items_catalog_small_image']) != ''))
		{
			// Копируем основные картинки товара
			$kernel = & singleton('kernel');

			// Путь к изображениям
			$path = CMS_FOLDER . $shop->GetItemDir($shop_items_catalog_id);

			// Если большое изображение не пустое
			if ($item_row['shop_items_catalog_image'] != '')
			{
				// Генерируем путь к файлу большого изображения основного товара
				$main_big_image = "$path{$item_row['shop_items_catalog_image']}";

				$param['path_source_big_image'] = $main_big_image;

				// Получаем расширение файла большого изображения
				$extension_big = $kernel->GetExtension($item_row['shop_items_catalog_image']);
			}

			if ($item_row['shop_items_catalog_small_image'] != '')
			{
				// Генерируем путь к файлу малого изображения основного товара
				$main_small_image = "$path{$item_row['shop_items_catalog_small_image']}";

				$param['path_source_small_image'] = $main_small_image;

				// Получаем расширение файла малого изображения
				$extension_small = $kernel->GetExtension($item_row['shop_items_catalog_small_image']);
			}
		}

		// Пробегаемся по массиву элементов списка
		foreach ($property_array as $key => $val)
		{
			/*
			 * Индексы изменяются с шагом
			 * - для первого массива: [число сочетаний] / [число элементов]
			 * - для последующих массивов: [шаг_изменения_индексов_предыдущего_массива] / [число элементов]
			 *
			 * Пример:
			 * Исходные массивы: array(1,2), array(1,2), array(1,2)
			 *
			 * 1 1 1
			 * 1 1 2
			 * 1 2 1
			 * 1 2 2
			 * 2 1 1
			 * 2 1 2
			 * 2 2 1
			 * 2 2 2
			 *
			 */

			$step[$key] = !$key
				// Первый массив
				? $count / count($val)
				// Последующие массивы
				: $step[$key -1] / count($val);

			// Текущие индексы у всех массивов - 0
			$ind[$key] = 0;
		}

		// Генерируем модификации
		// Для каждого сочетания
		for ($j = 0; $j < $count; $j++)
		{
			// Название модификации
			$param['name'] = $items_catalog_name;

			// Артикул
			$param['marking'] = $items_catalog_marking;

			// Для каждого списка
			foreach ($property_array as $key => $val)
			{
				// Если номер итерации кратен шагу изменения индексов массива
				if ($j > 0 && fmod($j, $step[$key]) == 0)
				{
					// Передвигаемся на следующий элемент
					$ind[$key]++;
				}

				// Обошли все элементы списка - начинаем заново
				if ($ind[$key] > count($val) - 1)
				{
					$ind[$key] = 0;
				}

				$return_array[$j][$properties_id_list[$key]] = $val[$ind[$key]];

				// Название модицикации
				$param['name'] = str_replace('{P' . $properties_id_list[$key] . '}', $property_value[$val[$ind[$key]]]['lists_items_value'], $param['name']);

				// Артикул
				$param['marking'] = str_replace('{P' . $properties_id_list[$key] . '}', $property_value[$val[$ind[$key]]]['lists_items_value'], $param['marking']);
			}

			// Для название модицикации меняем {N}
			$param['name'] = str_replace("{N}", $j +1, $param['name']);

			// Для артикула меняем {N}
			$param['marking'] = str_replace("{N}", $j +1, $param['marking']);
			$param['search_event_indexation'] = FALSE;

			// Вставляем модификацию
			$item_copy_id = $shop->InsertItem($param);

			// Модификация добавлена
			if ($item_copy_id)
			{
				// Копировать основные атрибуты основного товара
				if (isset ($_REQUEST['copy_main_properties']))
				{
					// Копируем основные картинки товара
					if (to_str($item_row['shop_items_catalog_image']) != '' || to_str($item_row['shop_items_catalog_small_image']) != '')
					{
						// Если большое изображение не пустое
						if ($item_row['shop_items_catalog_image'] != '')
						{
							// Если расширение не пустое
							if (to_str($extension_big) != '')
							{
								// Имя файла пойдет в базу
								$param_update_images['original_file_name_big_image'] = "shop_items_catalog_image$item_copy_id.$extension_big";

								$param_update_images['path_source_big_image'] = $main_big_image;
							}
						}

						// Если малое изображение не пустое
						if ($item_row['shop_items_catalog_small_image'] != '')
						{
							// Если расширение не пустое
							if (to_str($extension_small) != '')
							{
								// Имя файла пойдет в базу
								$param_update_images['original_file_name_small_image'] = "small_shop_items_catalog_image$item_copy_id.$extension_small";

								$param_update_images['path_source_small_image'] = $main_small_image;
							}
						}

						// Без значений этих параметров - информация не обновится
						// Копировать параметры экспорта/импорта
						if (isset ($_REQUEST['copy_export_import']))
						{
							$param_update_images['shop_items_catalog_yandex_market_allow'] = to_int($param['shop_items_catalog_yandex_market_allow']);
							$param_update_images['shop_items_catalog_yandex_market_bid'] = to_int($param['shop_items_catalog_yandex_market_bid']);
							$param_update_images['shop_items_catalog_yandex_market_cid'] = to_int($param['shop_items_catalog_yandex_market_cid']);
							$param_update_images['shop_vendorcode'] = to_str($item_row['shop_vendorcode']);
							$param_update_images['shop_items_catalog_rambler_pokupki_allow'] = to_int($param['shop_items_catalog_rambler_pokupki_allow']);
							$param_update_images['shop_items_catalog_yandex_market_sales_notes'] = to_str($param['shop_items_catalog_yandex_market_sales_notes']);
							$param_update_images['shop_items_cml_id'] = to_str($item_row['shop_items_cml_id']);
						}

						// Копировать основные атрибуты основного товара
						if (isset ($_REQUEST['copy_main_properties']))
						{
							$param_update_images['weight'] = $param['weight'];
						}

						$param_update_images['shops_id'] = $shop_shops_id;
						$param_update_images['item_id'] = $item_copy_id;
						$param_update_images['price'] = $price;

						$shop_row = $shop->GetShop($shop_shops_id);

						// Необходимо передать размеры изображения
						$param_update_images['max_width_big_image'] = $shop_row['shop_image_big_max_width_group'];
						$param_update_images['max_height_big_image'] = $shop_row['shop_image_big_max_height_group'];
						$param_update_images['max_width_small_image'] = $shop_row['shop_image_small_max_width_group'];
						$param_update_images['max_height_small_image'] = $shop_row['shop_image_small_max_height_group'];
						
						$param_update_images['search_event_indexation'] = FALSE;

						// Обновляем информацию о товаре
						$shop->InsertItem($param_update_images);
					}
				}

				// Копирование тегов (меток)
				if (isset($_REQUEST['copy_tags']))
				{
					$Tag = & singleton('Tag');

					// Получаем список связанных меток
					$tag_result = $Tag->GetTagRelation(array (
						'shop_items_catalog_item_id' => $shop_items_catalog_id
					));

					if ($tag_result && count($tag_result))
					{
						foreach ($tag_result as $k => $v)
						{
							// Связываем тэг с товаром
							$Tag->InsertTagRelation(array (
							'tag_id' => $k,
							'shop_items_catalog_item_id' => $item_copy_id
							));
						}
					}
					
					$Tag->CacheGetTagRelation = array();
				}

				// Копировать доп. цены для товара
				if (isset ($_REQUEST['copy_prices_to_item']))
				{
					// Получаем список цен для копируемого товара
					if ($res_all_prices_for_shop = $shop->GetAllPricesForItem($shop_items_catalog_id))
					{
						foreach ($res_all_prices_for_shop as $key => $val)
						{
							$param_price_to_item = array ();

							$param_price_to_item['shop_items_catalog_item_id'] = $item_copy_id;
							$param_price_to_item['shop_list_of_prices_id'] = $key;
							$param_price_to_item['shop_prices_to_item_value'] = $val['shop_prices_to_item_value'];

							$shop->InsertPricesToItem($param_price_to_item);
						}
					}
				}

				// Копировать спец. цены для товара
				if (isset ($_REQUEST['copy_specials_prices_to_item']))
				{
					// Получаем список цен для копируемого товара
					if ($res_special_prices_for_item = $shop->GetAllSpecialPricesForItem($shop_items_catalog_id))
					{
						while ($row_special_prices_for_item = mysql_fetch_assoc($res_special_prices_for_item))
						{
							$param_special_price_to_item = array ();
							$param_special_price_to_item['shop_items_catalog_item_id'] = $item_copy_id;
							$param_special_price_to_item['shop_special_prices_from'] = $row_special_prices_for_item['shop_special_prices_from'];
							$param_special_price_to_item['shop_special_prices_to'] = $row_special_prices_for_item['shop_special_prices_to'];
							$param_special_price_to_item['shop_special_prices_price'] = $row_special_prices_for_item['shop_special_prices_price'];
							$param_special_price_to_item['shop_special_prices_percent'] = $row_special_prices_for_item['shop_special_prices_percent'];

							$shop->InsertSpecialPrice($param_special_price_to_item);
						}
					}
				}

				// Копировать сопутствующие товары
				if (isset ($_REQUEST['copy_tying_products']))
				{
					// Получаем список сопутствующих товаров основному товару
					$query = "SELECT * FROM `shop_intermediate_table` " .
					"WHERE `shop_items_catalog_item_id` = '{$shop_items_catalog_id}'";

					$tying_products_res = $DataBase->query($query);

					if (mysql_num_rows($tying_products_res))
					{
						$param_tying_products = array ();
						$param_tying_products['shop_items_catalog_item_id'] = $item_copy_id;

						while ($tying_products_row = mysql_fetch_assoc($tying_products_res))
						{
							$param_tying_products['sho_shop_items_catalog_item_id'] = to_int($tying_products_row['sho_shop_items_catalog_item_id']);

							$shop->InsertTyingProducts($param_tying_products);
						}
					}
				}

				// Копировать все остальные доп. свойства товара
				if (isset ($_REQUEST['copy_external_property']))
				{
					// Копируем доп. свойства
					if ($item_copy_id)
					{
						$shop->CopyExternalPropertiesForItem($shop_items_catalog_id, $item_copy_id, $shop_shops_id);
					}
				}

				/*if ($item_row['shop_items_catalog_type'] == 0 && isset ($_REQUEST['copy_eitems']))
				{
					// проверяем есть ли у данного товара электронные товары
					$eitems_res = $shop->GetEitemsForItem($shop_items_catalog_id);

					if (mysql_num_rows($eitems_res))
					{
					while ($eitems_row = mysql_fetch_assoc($eitems_res))
					{
					// Удаляем идентификатор электронного товара (чтобы была произвведена вставка)
					unset($eitems_row['shop_eitem_id']);
					$eitems_row['shop_items_catalog_item_id'] = $item_copy_id;

					// Вставляем эл. товар
					$shop->InsertEItem($eitems_row);
					}
					}
				}*/

				// Вставляем значения списков, по которым генерируются модификации
				foreach ($return_array[$j] as $key => $val)
				{
					$properties_param['shop_items_catalog_item_id'] = $item_copy_id;
					$properties_param['shop_list_of_properties_id'] = $key;
					$properties_param['shop_properties_items_value'] = $val;
					$shop->InsertPropertiesItem($properties_param);
				}
			}
			else
			{
				$error_flag = true;
			}
		}
	}
}

// Сообщения на странице
if (!$error_flag)
{
	show_message($GLOBALS['MSG_shops']['create_modification_success']);
}
else
{
	show_error_message($GLOBALS['MSG_shops']['create_modification_error']);
}
