package com.yoke.poseidon.order.serviceImpl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yoke.poseidon.order.constants.OrderConstant;
import com.yoke.poseidon.order.dto.OrderDto;
import com.yoke.poseidon.order.dto.OrderItemDto;
import com.yoke.poseidon.order.entity.Order;
import com.yoke.poseidon.order.entity.OrderItem;
import com.yoke.poseidon.order.mapper.OrderItemMapper;
import com.yoke.poseidon.order.mapper.OrderMapper;
import com.yoke.poseidon.order.service.ConvertService;
import com.yoke.poseidon.order.service.OrderItemService;
import com.yoke.poseidon.order.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author yoke
 * @since 2019-02-03
 */
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order>
		implements OrderService {

	private final OrderMapper orderMapper;

	private final ConvertService convertService;

	private final OrderItemMapper orderItemMapper;

	private final OrderItemService orderItemService;

	@Autowired
	public OrderServiceImpl(OrderMapper orderMapper, ConvertService convertService,
			OrderItemMapper orderItemMapper, OrderItemService orderItemService) {
		this.orderMapper = orderMapper;
		this.convertService = convertService;
		this.orderItemMapper = orderItemMapper;
		this.orderItemService = orderItemService;
	}

	@Override
	public List<OrderDto> getByBuyerId(@NotNull Long buyerId, @NotNull Integer op) {
		List<OrderDto> ret = convertService.convertOrder(orderMapper.selectList(
				new QueryWrapper<Order>().eq("buyer_id", buyerId).eq("status", op)));
		ret.forEach(orderDto -> {
			List<OrderItemDto> orderDetails = convertService.convertOrderItem(
					orderItemMapper.selectByOrderId(orderDto.getOrderId()));
			orderDto.setOrderItemDtoList(orderDetails);
		});
		return ret;
	}

	@Override
	public OrderDto createOrder(@NotNull OrderDto orderDto) {
		try {
			Order order = convertService.convertOrderDto(orderDto);
			String orderId = UUID.randomUUID().toString().replace("-", "");
			order.setOrderId(orderId);
			order.setCreateTime(new Date());
			order.setStatus(OrderConstant.UN_PAID);
			List<OrderItem> orderItemList = convertService
					.convertOrderItemDto(orderDto.getOrderItemDtoList());
			orderItemList.forEach(orderItem -> {
				String orderItemId = UUID.randomUUID().toString().replace("-", "");
				orderItem.setOrderId(orderId);
				orderItem.setId(orderItemId);
			});
			orderMapper.insert(order);
			orderItemService.saveBatch(orderItemList);
			return orderDto;
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public boolean cancelOrder(@NotNull String orderId) {
		Order order = orderMapper.selectById(orderId);
		order.setStatus(OrderConstant.CANCEL);
		return updateById(order);
	}

	@Override
	public IPage<OrderDto> getPageByBuyerId(Long buyerId, Integer status, long current,
			long size) {
		Page page = new Page(current, size);
		IPage<OrderDto> orderDtoIPage = orderMapper.selectPageByBuyerId(page, buyerId,
				status);
		List<OrderDto> records = orderDtoIPage.getRecords();
		records.forEach(orderDto -> {
			List<OrderItemDto> orderDetails = convertService.convertOrderItem(
					orderItemMapper.selectByOrderId(orderDto.getOrderId()));
			orderDto.setOrderItemDtoList(orderDetails);
		});
		return orderDtoIPage.setRecords(records);
	}

	@Override
	public boolean update(String orderId, Integer status) {
		Order order = getById(orderId);
		if (order != null) {
			order.setStatus(status);
			return updateById(order);
		}
		return false;
	}

	@Override
	public List<Map<Integer, Integer>> statisticStatus(Long buyerId) {
		return orderMapper.groupByStatus(buyerId);
	}

}