use webs;
drop function if exists cart;
drop function if exists add_to_cart;

delimiter $$
create function cart(user_id int) -- get current order for user_id (cart order id)
returns int
begin
	set @order_id = (select id from `order` where status = 1 and user = user_id);
	if @order_id is not null then
		return @order_id;
	end if;
	insert into `order` (`user`) values (user_id);
	set @order_id = (select id from `order` where status = 1 and user = user_id);
	return @order_id;
end$$

create function add_to_cart(product_id int, user_id int)
returns boolean
begin
	set @orderproduct_id = (select id from orderproduct where product = product_id and `order` = cart(user_id));
	if @orderproduct_id is not null then
		update orderproduct set count = count + 1 where id = @orderproduct_id;
		return true;
	end if;
	insert into orderproduct (`product`, `count`, `order`) values (product_id, 1, cart(user_id));
	return false;
end$$

create function cart_sum(order_id int) -- get cart sum for order
returns int
begin
	return (
		with precalc
		as (
			select
				product.price,
				orderproduct.count,
				promotion.count_buff,
				promotion.price_buff,
				floor(orderproduct.count / promotion.count_buff) * promotion.count_buff as qualify_count,
				mod(orderproduct.count, promotion.count_buff) as remainder_count
			from orderproduct
			join product on product.id = orderproduct.product
			join promotion on promotion.product = product.id
			where `order` = order_id
		)
		select sum(price * qualify_count * price_buff + price * remainder_count)
		from precalc
	);
end$$

delimiter ;

