package com.aucma.production.service.impl;

import java.util.List;

import com.aucma.common.exception.ServiceException;
import com.aucma.common.utils.DateUtils;
import com.aucma.common.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.aucma.production.domain.ProdTaskPool;
import com.aucma.production.mapper.ProdTaskPoolMapper;
import com.aucma.production.service.IProdTaskPoolService;

@Service
public class ProdTaskPoolServiceImpl implements IProdTaskPoolService {
    @Autowired
    private ProdTaskPoolMapper prodTaskPoolMapper;

    @Override
    public ProdTaskPool selectProdTaskPoolByOrderCode(String orderCode) {
        return prodTaskPoolMapper.selectProdTaskPoolByOrderCode(orderCode);
    }

    @Override
    public List<ProdTaskPool> selectProdTaskPoolList(ProdTaskPool prodTaskPool) {
        return prodTaskPoolMapper.selectProdTaskPoolList(prodTaskPool);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public int insertProdTaskPool(ProdTaskPool prodTaskPool) {
        validateTask(prodTaskPool);
        ProdTaskPool existed = prodTaskPoolMapper.selectProdTaskPoolByOrderCode(prodTaskPool.getOrderCode());
        if (existed != null && existed.getObjId() != null) {
            prodTaskPool.setObjId(existed.getObjId());
            prodTaskPool.setUpdatedTime(DateUtils.getNowDate());
            return prodTaskPoolMapper.updateProdTaskPool(prodTaskPool);
        }
        prodTaskPool.setCreatedTime(DateUtils.getNowDate());
        return prodTaskPoolMapper.insertProdTaskPool(prodTaskPool);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public int updateProdTaskPool(ProdTaskPool prodTaskPool) {
        validateTask(prodTaskPool);
        ProdTaskPool existed = prodTaskPoolMapper.selectProdTaskPoolByOrderCode(prodTaskPool.getOrderCode());
        if (existed == null || existed.getObjId() == null) {
            prodTaskPool.setCreatedTime(DateUtils.getNowDate());
            return prodTaskPoolMapper.insertProdTaskPool(prodTaskPool);
        }
        prodTaskPool.setObjId(existed.getObjId());
        prodTaskPool.setUpdatedTime(DateUtils.getNowDate());
        return prodTaskPoolMapper.updateProdTaskPool(prodTaskPool);
    }

    @Override
    public int deleteProdTaskPoolByOrderCodes(String[] orderCodes) {
        return prodTaskPoolMapper.deleteProdTaskPoolByOrderCodes(orderCodes);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public int changeTaskStatus(ProdTaskPool prodTaskPool) {
        if (prodTaskPool == null || StringUtils.isBlank(prodTaskPool.getOrderCode())) {
            throw new ServiceException("工单编号不能为空");
        }
        if (StringUtils.isBlank(prodTaskPool.getExecutionStatus())) {
            throw new ServiceException("执行状态不能为空");
        }
        ProdTaskPool snapshot = prodTaskPoolMapper.selectProdTaskPoolByOrderCode(prodTaskPool.getOrderCode());
        if (snapshot == null) {
            throw new ServiceException("工单不存在，无法变更任务状态");
        }
        // 为什么任务池状态直接回写工单执行状态：任务池只是执行视图，不能再维护一套脱离工单主表的状态副本。
        prodTaskPool.setUpdatedTime(DateUtils.getNowDate());
        return prodTaskPoolMapper.updateOrderExecutionStatus(prodTaskPool);
    }

    private void validateTask(ProdTaskPool prodTaskPool) {
        if (prodTaskPool == null) {
            throw new ServiceException("任务池数据不能为空");
        }
        if (StringUtils.isBlank(prodTaskPool.getOrderCode())) {
            throw new ServiceException("工单编号不能为空");
        }
        ProdTaskPool snapshot = prodTaskPoolMapper.selectProdTaskPoolByOrderCode(prodTaskPool.getOrderCode());
        if (snapshot == null) {
            throw new ServiceException("工单不存在，无法维护任务池");
        }
        if (StringUtils.isBlank(prodTaskPool.getPriorityLevel())) {
            prodTaskPool.setPriorityLevel("NORMAL");
        }
    }
}
