package com.iamberry.wechat.service.product;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.ModelAndView;

import com.iamberry.wechat.core.entity.banner.MessageDTO;
import com.iamberry.wechat.core.entity.product.Product;
import com.iamberry.wechat.core.entity.product.ProductColor;
import com.iamberry.wechat.core.entity.product.ProductImageText;
import com.iamberry.wechat.core.entity.product.ProductPicture;
import com.iamberry.wechat.face.porduct.ProductImageTextService;
import com.iamberry.wechat.face.porduct.ProductService;
import com.iamberry.wechat.service.mapper.ProductColorMapper;
import com.iamberry.wechat.service.product.dao.ProductDao;
import com.iamberry.wechat.service.product.dao.ProductImageTextDAO;
import com.iamberry.wechat.service.product.dao.ProductPictureDAO;

/**
 * 产品信息处理 service 实现类
 * 2016年4月21日
 * @author Administrator
 *
 */
@Service
public class ProductServiceImpl implements ProductService{
	@Autowired
	private ProductDao productDao;
	@Autowired
	private ProductImageTextDAO productImageTextDAO;
	@Autowired
	private ProductPictureDAO productPictureDAO;
	@Autowired
	private ProductColorMapper productColorMapper;
	@Autowired
	private ProductImageTextService productImageTextService;	//图文service	

	/**
	 * 获取所有产品信息并分页
	 * 2016年4月21日
	 * @author 穆再兴
	 * @param page
	 * @return
	 */
	public List<Product> selectAllProductInfo(Product product){
		product.getPage().initRecordBegin();
		return productDao.selectAllProductInfo(product);
	}
	
	/**
	 * 根据productId 查询单个产品
	 * 2016年4月22日
	 * @author 穆再兴
	 * @param productId
	 * @return
	 */
	public Product selectProductByProductId(Integer productId){
		return productDao.selectProductByProductId(productId);
	}
	
	/**
	 * 查所有产品个数 后台分页用
	 * 2016年4月23日
	 * @author 穆再兴
	 * @return
	 */
	public Integer selectProductCount(Product product){
		return productDao.selectProductCount(product);
	}
	
	@Override
	public List<Product> selectProductIdAndName() {
		// TODO Auto-generated method stub
		return productDao.selectProductIdAndName();
	}

	/**
	 * 添加一个产品	返回 productId
	 * 2016年4月21日
	 * @author 穆再兴
	 * @return
	 */
	public ModelAndView addProduct(Product product, List<ProductPicture> picList){
		ModelAndView mv = new ModelAndView("admin/msg/msg");
		mv.addObject("msgObj", new MessageDTO(true, "操作结果", "添加失败！"));
		mv.addObject("status", false);
		int i = productDao.addProduct(product);
		if(i > 0){
			//添加商品图文
			if(StringUtils.isNotEmpty(product.getProductImageText().getImagetextContext())){
				ProductImageText imageText = product.getProductImageText();
				imageText.setImagetextProduectId(product.getProductId());
				imageText.setImagetextCreateDate(new Date());
				if(productImageTextDAO.addProductImageText(imageText) < 1){
					mv.addObject("msgObj", new MessageDTO(true, "操作结果", "添加产品图文失败!"));			
					return mv;
				}
			}
			//添加产品banner图
			if(StringUtils.isNotEmpty(picList.get(0).getPictureUrl())){
				for (ProductPicture pp : picList) {
					pp.setPictureProductId(product.getProductId());
					if(productPictureDAO.addProductPicture(pp) < 1){
						mv.addObject("msgObj", new MessageDTO(true, "操作结果", "添加产品轮播图失败!"));
					}
				}
			}
			//添加产品颜色
			List<ProductColor> cList = product.getColorList();
			for (ProductColor color : cList) {
				color.setColorProductId(product.getProductId());
				color.setColorCretaeTime(new Date());
				color.setColorProductName(product.getProductName());
				color.setColorProductType(product.getProductType().getTypeId());
			}
			if(productColorMapper.insertProductColorList(cList) < 1){
				mv.addObject("msgObj", new MessageDTO(true, "操作结果", "添加产品颜色失败!"));
			}
		}
		mv.addObject("status", true);
		return mv;
	}
	
	/**
	 * 根据 productId 修改一个产品的信息
	 * 2016年4月22日
	 * @author 穆再兴
	 * @param product
	 * @return
	 */
	public ModelAndView updateProductByProductId(Product product, String[] imageUrls){
		ModelAndView mv = new ModelAndView("admin/msg/msg");
		mv.addObject("msgObj", new MessageDTO(false, "操作结果", "修改失败！"));
		mv.addObject("status", false);
		int i = productDao.updateProductByProductId(product);
		if(i < 1){
			return mv;
		}

		Map<String, List<ProductColor>> map = splitListToAddAndUpdateList(product);
		if(updateColorList(map.get("hasColorList")) 
				&& addColorList(product.getProductId(), map.get("newColorList"))
				&& updateProductImageByProductId(product)
				&& updateProductBannerList(product, imageUrls)){
			mv.addObject("msgObj", new MessageDTO(true, "操作结果", "修改成功！"));
			mv.addObject("status", true);
		}
		return mv;
	}
	
	/**
	 * 将表单提交上来的颜色集合拆分为：
	 * 1.原有的<修改>
	 * 2.新增的<添加>
	 * 注：原有的提交上来的没有<即删除>：经过商讨后决定不做,不允许删除
	 * 2017年4月17日
	 * @author muzx
	 * @return
	 */
	private Map<String, List<ProductColor>> splitListToAddAndUpdateList(Product product){
		Map<String, List<ProductColor>> map = new HashMap<String, List<ProductColor>>();
		List<ProductColor> formColorList = product.getColorList();
		List<ProductColor> oldColorList = productColorMapper.getLeaseProductColor(product.getProductId());
		
		Iterator<ProductColor> it = formColorList.iterator();
		ProductColor hasColor = null;
		List<ProductColor> hasColorList = new ArrayList<ProductColor>();
		while (it.hasNext()) {
//			hasColor = (ProductColor) it.next();
			hasColor = (ProductColor)it.next();
			for (ProductColor oldColor : oldColorList) {
				if(hasColor.getColorId() == oldColor.getColorId()){
					hasColorList.add(hasColor);
					it.remove();
					break;
				}
			}
		}
		map.put("hasColorList", hasColorList);
		map.put("newColorList", formColorList);
		return map;
	}
	
	/**
	 * 批量修改产品颜色信息
	 * 2017年4月17日
	 * @author muzx
	 * @param colorList
	 * @return
	 */
	private boolean updateColorList(List<ProductColor> colorList){
		for (ProductColor productColor : colorList) {
			if(productColor.getColorId() != null){
				if(productColorMapper.updateProductColorById(productColor) < 1){
					return false;
				}
			}
		}
		return true;
	}
	
	/**
	 * 批量添加产品颜色信息
	 * 2017年4月17日
	 * @author muzx
	 * @param colorList
	 * @return
	 */
	public boolean addColorList(int productId, List<ProductColor> colorList){
		for (ProductColor productColor : colorList) {
			productColor.setColorProductId(productId);
			if(productColorMapper.insertProductColor(productColor) < 1){
				return false;
			}
		}
		return true;
	}
	
	/**
	 * 修改商品图文
	 * 2017年4月17日
	 * @author muzx
	 * @param product
	 * @return
	 */
	private boolean updateProductImageByProductId(Product product){
		if(StringUtils.isNotEmpty(product.getProductImageText().getImagetextContext())){
			ProductImageText imageText = productImageTextDAO.getProductImageTextByProduectId(product.getProductId());
			ProductImageText productImageText = product.getProductImageText();
			productImageText.setImagetextId(imageText.getImagetextId());
			if(imageText != null){
				if(productImageTextDAO.updateProductImageTextById(productImageText) < 0){
					return false;
				}
			}else{
				imageText = new ProductImageText();
				imageText.setImagetextContext(product.getProductImageText().getImagetextContext());
				imageText.setImagetextProduectId(product.getProductId());
				
				imageText.setImagetextCreateDate(new Date());
				if(productImageTextDAO.addProductImageText(imageText) < 0){
					return false;
				}
			}
		}
		return true;
	}
	/**
	 * 修改banner图
	 * 2017年4月17日
	 * @author muzx
	 * @param product
	 * @param imageUrls
	 * @return
	 */
	private boolean updateProductBannerList(Product product, String[] imageUrls){
		if(imageUrls == null || imageUrls.length < 1){
			return true;
		}
		ProductPicture pp = new ProductPicture();
		pp.setPictureProductId(product.getProductId());
		pp.setPictureCreateDate(new Date());
		for(int i = 0 ; i < imageUrls.length;i++){
			pp.setPictureUrl(imageUrls[i]);
			if(productPictureDAO.addProductPicture(pp) < 1){
				return false;
			}
		}
		return true;
	}
	/**
	 * 根据 productId 修改一个产品的状态
	 * 2016年4月22日
	 * @author 穆再兴
	 * @param product
	 * @return
	 */
	public Integer updateProductStatusByProductId(Product product){
		return productDao.updateProductStatusByProductId(product);
	}

}
