package com.uas.search.dao;

import com.uas.search.exception.DataNotFoundException;
import com.uas.search.model.PCB;
import com.uas.search.model.PCBGoods;
import com.uas.search.model.TradeGoods;
import com.uas.search.util.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.List;

/**
 * PCB 批次
 *
 * @author sunyj
 * @since 2018/4/26 9:09
 */
@Repository
public class PCBGoodsDao {

    @Autowired
    private TradeGoodsDao tradeGoodsDao;

    @Autowired
    private PCBDao pcbDao;

    /**
     * 根据批次 id 或者 PCB id 获取批次
     *
     * @param pcbGoods 批次 id 或者 PCB id
     * @return 批次
     */
    public List<PCBGoods> find(PCBGoods pcbGoods) {
        if (pcbGoods == null) {
            return null;
        }
        List<PCBGoods> goodsesList = new ArrayList<>();
        if (pcbGoods.getPcb() != null && pcbGoods.getPcb().getId() != null) {
            goodsesList.addAll(findByPCBId(pcbGoods.getPcb().getId()));
        } else if (pcbGoods.getTradeGoods() != null && pcbGoods.getTradeGoods().getId() != null) {
            goodsesList.add(findByGoId(pcbGoods.getTradeGoods().getId()));
        }
        return goodsesList;
    }

    /**
     * 根据批次 id 获取批次信息
     *
     * @param goId 批次 id
     * @return 批次信息
     */
    private PCBGoods findByGoId(Long goId) {
        TradeGoods tradeGoods = tradeGoodsDao.findOne(goId);
        if (tradeGoods == null) {
            throw new DataNotFoundException("批次不存在：" + goId);
        }
        return findByTradeGoods(tradeGoods);
    }

    /**
     * 获取批次信息
     *
     * @param tradeGoods 批次
     * @return 批次信息
     */
    public PCBGoods findByTradeGoods(TradeGoods tradeGoods) {
        if (tradeGoods.getProductId() != null) {
            PCB pcb = pcbDao.findByProducts_Id(tradeGoods.getProductId());
            if (pcb != null) {
                return new PCBGoods(tradeGoods, pcb);
            }
        }
        return null;
    }

    /**
     * 根据 PCB id 获取批次信息
     *
     * @param pcbId PCB id
     * @return 批次信息
     */
    public List<PCBGoods> findByPCBId(Long pcbId) {
        PCB pcb = pcbDao.findOne(pcbId);
        if (pcb == null) {
            throw new DataNotFoundException("PCB 不存在：" + pcbId);
        }
        return findByPCB(pcb);
    }

    /**
     * 根据 PCB 获取批次信息
     *
     * @param pcb PCB
     * @return 批次信息
     */
    public List<PCBGoods> findByPCB(PCB pcb) {
        if (pcb == null || pcb.getProducts() == null || pcb.getProducts().getId() == null) {
            return null;
        }
        List<PCBGoods> pcbGoodsesList = new ArrayList<>();
        List<TradeGoods> tradeGoodsesList = tradeGoodsDao.findByProductId(pcb.getProducts().getId());
        boolean hasValidGoods = false;
        if (!CollectionUtils.isEmpty(tradeGoodsesList)) {
            for (TradeGoods tradeGoods : tradeGoodsesList) {
                // 判断 PCB 下是否有状态有效的批次
                if (!hasValidGoods && isValidStatus(tradeGoods.getStatus())) {
                    hasValidGoods = true;
                }
                pcbGoodsesList.add(new PCBGoods(tradeGoods, pcb));
            }
        }

        //  PCB 下没有状态有效的批次（可能没有批次，或者批次状态全都无效）时，另外保存一份不含批次信息的 PCB 数据
        if (!hasValidGoods) {
            pcbGoodsesList.add(new PCBGoods(null, pcb));
        }
        return pcbGoodsesList;
    }

    /**
     * 是否为有效状态
     *
     * @param status 状态
     * @return true 有效；false 无效
     */
    private boolean isValidStatus(Long status) {
        if (status == null) {
            return false;
        }
        for (Long validStatus : TradeGoods.VALID_STATUS) {
            if (validStatus.longValue() == status.longValue()) {
                return true;
            }
        }
        return false;
    }
}
