/*
 * (c) MaxSite CMS
 * https://max-3000.com/
 *
 * Корзина — основой объект
 * Используется jQuery
 */

// указывается ключ localStorage, где хранится корзина
// cartVar, cartS — массивы опций
function Cart(key, cartVar, cartS) 
{
	var self = this;
	var total = 0;
	var currentItemCount = 0; // колво последнего добавленного товара  
	
	this.getCartData = function()
	{
		return JSON.parse(localStorage.getItem(key)) || {};
	}
	
	this.setCartData = function(data) 
	{
		localStorage.setItem(key, JSON.stringify(data));
	}
	
	this.clearCart = function()
	{
		localStorage.setItem(key, '{}');
	}
	
	this.log = function()
	{
		console.log(self.getCartData());
	}
	
	this.addToCart = function(itemId, itemName = '', itemPrice = 0, itemMaxCount = 1, itemDesc = '')
	{
		var cartData = self.getCartData();
		var dt = new Date();
		var count = 1;

		if(cartData.hasOwnProperty(itemId)) 
		{
			count = Number(cartData[itemId]['count']) + 1;
			if (count > itemMaxCount) { count = itemMaxCount; }
		} 
		else 
		{
			count = 1;
		}
		
		cartData[itemId] = {
			'name': itemName,
			'desc': itemDesc,
			'price': itemPrice,
			'count': count,
			'maxcount': itemMaxCount,
			'time': dt.toISOString()
		};
		
		self.currentItemCount = count;
		
		// console.log(cartData);
		
		self.setCartData(cartData); // записываем данные
	}
	
	// получить число уникальных товаров в корзине
	this.getCountItems = function()
	{
		var cartData = self.getCartData();

		return Object.keys(cartData).length;
	}
	
	// вывести корзину
	this.showItems = function(format, count0, empty = true)
	{
		var cartData = self.getCartData();
		var out = '';
		var name, price, count, sum, maxcount, desc, f1, c0;
		
		self.total = 0;
		
		// console.log(format);
		
		for (var key in cartData) 
		{
			// console.log(key);
			// console.log(cartData[key]);
			// console.log(cartData[key]['name']);
			// console.log(cartData[key]['price']);
			// console.log(cartData[key]['count']);
			// console.log(cartData[key]['maxcount']);
			
			name = cartData[key]['name'];
			desc = cartData[key]['desc'];
			price = cartData[key]['price'];
			maxcount = cartData[key]['maxcount'];
			count = cartData[key]['count'];
			sum = price * count;
			
			// если стоит флаг, то если колво=0, то не добавляем в вывод
			if (!empty)
			{
				if (count == 0) continue;
			}
			
			if (count == 0) 
			{ 
				c0 = count0; 
			}
			else
			{
				c0 = '';
			}
			
			if (desc) 
			{ 
				desc = cartVar['desc_start'] + desc + cartVar['desc_end']; 
			}
			
			f1 = format;
			f1 = f1.replace(/{key}/ig, key);
			f1 = f1.replace(/{name}/ig, name);
			f1 = f1.replace(/{price}/ig, price);
			f1 = f1.replace(/{count}/ig, count);
			f1 = f1.replace(/{maxcount}/ig, maxcount);
			f1 = f1.replace(/{desc}/ig, desc);
			f1 = f1.replace(/{sum}/ig, sum);
			f1 = f1.replace(/{count0}/ig, c0);
			
			out = out + f1;
				
			self.total = self.total + sum;
		}
		
		if (!out) { out = cartVar['cart_empty']; }

		return out;
	}
	
	// изменяется количество для указанного id
	this.changeCount = function(itemId, itemCount)
	{
		var cartData = self.getCartData();
		
		cartData[itemId]['count'] = itemCount;
		
		// console.log(cartData);
		
		self.setCartData(cartData); // записываем данные
	}
	
	
	// проставим колво каждого товара
	this.showItemsCount = function()
	{
		var items = $(cartS['showItemsCount']);
		var cartData = self.getCartData();

		items.each(function(i, e){
			var item = $(e);
			var itemId = item.data('id');
			var count = 0;
			
			if (itemId)
			{
				if(cartData.hasOwnProperty(itemId)) 
				{
					count = Number(cartData[itemId]['count']);
					item.html(cartVar['item_count_start'] + count + cartVar['item_count_end']);
				}
				else
				{
					item.html('');
				}
			}
		});
	}
	
	// показать саму корзину (с полями редактирования)
	this.showCart = function(t1 = '', t2 = '')
	{
		$(cartS['tableItems']).html(
			t1
			+ self.showItems(cartVar['format'], cartVar['count0'])
			+ cartVar['total_start'] 
			+ self.total + cartVar['currency']
			+ cartVar['total_end']
			+ t2
		);
	}
	
	// показать саму корзину (без полей редактирования)
	this.showCartNoEdit = function(t1 = '', t2 = '')
	{
		$(cartS['tableItems']).html(
			t1
			+ self.showItems(cartVar['format_noedit'], cartVar['count0'])
			+ cartVar['total_start'] 
			+ self.total + cartVar['currency']
			+ cartVar['total_end']
			+ t2
		);
	}
	
	// показать саму корзину без пустых товаров и без редактирования
	this.showCartNoEmpty = function(selector, t1 = '', t2 = '')
	{
		$(selector).html(
			t1
			+ self.showItems(cartVar['format_noedit'], cartVar['count0'], false)
			+ cartVar['total_start'] 
			+ self.total + cartVar['currency']
			+ cartVar['total_end']
			+ t2
		);
	}
	
	
	// добавить товар
	this.addItem = function(e)
	{
		var itemId = e.data('id');
		var itemName = e.data('name');
		var itemPrice = e.data('price');
		var itemDesc = e.data('desc');
		var itemMaxCount = e.data('maxcount');
		
		if (!itemId || !itemName || !itemPrice) 
		{ 
			alert('Ошибка добавления товара в корзину (код ошибки add1)');
			return false;
		}

		if (!itemMaxCount) { itemMaxCount = 1 }; 
		if (!itemDesc) { itemDesc = '' }; 
		
		self.addToCart(itemId, itemName, itemPrice, itemMaxCount, itemDesc);
		
		return true;
	}
	
	// показать всего товаров в корзине
	this.showAllCount = function(t1 = '', t2 = '')
	{
		$(cartS['allCount']).html(
			t1
			+ cartVar['showItemsCount_start'] 
			+ self.getCountItems() 
			+ cartVar['showItemsCount_end']
			+ t2
		);
	}
	
	// показать сообщение
	this.showMessage = function(m, css_class = '', duration = 3000)
	{
		var e = $(cartS['message']);
				
		if (css_class)
		{
			e.html(m).addClass(css_class).show().animate({opacity: "hide"}, duration, (function(){ e.removeClass(css_class); }));
		}
		else
		{
			e.html(m).show().animate({opacity: "hide"}, duration);
		}
	}
	
	
	
	// получить input#hidden всех товаров
	this.setHiddenForOrder = function()
	{
		var cartData = self.getCartData();
		var out = '';
		var total = 0;
		var name, price, count, sum, maxcount, f1, total;
		
		for (var key in cartData) 
		{
			count = cartData[key]['count'];
			
			if (count == 0) continue;
			
			name = cartData[key]['name'];
			price = cartData[key]['price'];
			desc = cartData[key]['desc'];
			maxcount = cartData[key]['maxcount'];
			time = cartData[key]['time'];
			sum = price * count;
			
			f1 =      '<input type="hidden" name="cart[items][' + key + '][key]" value="' + key + '">';
			f1 = f1 + '<input type="hidden" name="cart[items][' + key + '][name]" value="' + name + '">';
			f1 = f1 + '<input type="hidden" name="cart[items][' + key + '][desc]" value="' + desc + '">';
			f1 = f1 + '<input type="hidden" name="cart[items][' + key + '][price]" value="' + price + '">';
			f1 = f1 + '<input type="hidden" name="cart[items][' + key + '][count]" value="' + count + '">';
			f1 = f1 + '<input type="hidden" name="cart[items][' + key + '][maxcount]" value="' + maxcount + '">';
			f1 = f1 + '<input type="hidden" name="cart[items][' + key + '][sum]" value="' + sum + '">';
			f1 = f1 + '<input type="hidden" name="cart[items][' + key + '][time]" value="' + time + '">';
			
			out = out + f1;
				
			total = total + sum;
		}
		
		out = out + '<input type="hidden" name="cart[total]" value="' + total + '">';
		

		return out;
	}
	
	
	return this;
	
} // Cart
