package com.microservices.pms.product.service.impl;

import com.microservices.common.core.exception.ServiceException;
import com.microservices.common.core.utils.DateUtils;
import com.microservices.pms.product.domain.PmsProductStatus;
import com.microservices.pms.product.domain.vo.PmsTypeDataVo;
import com.microservices.pms.product.mapper.PmsProductStatusMapper;
import com.microservices.pms.product.service.IPmsProductStatusService;
import com.microservices.pms.utils.PmsConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 产品状态Service业务层处理
 *
 * @author otto
 * @date 2023-10-16
 */
@Service
public class PmsProductStatusServiceImpl implements IPmsProductStatusService {
    @Autowired
    private PmsProductStatusMapper pmsProductStatusMapper;

    /**
     * 查询产品状态
     *
     * @param id 产品状态主键
     * @return 产品状态
     */
    @Override
    public PmsTypeDataVo selectPmsProductStatusById(Long id) {
        PmsProductStatus pmsProductStatus = pmsProductStatusMapper.selectPmsProductStatusById(id);
        if (pmsProductStatus == null) {
            throw new ServiceException("该状态不存在(状态ID[%d])", id);
        }
        return pmsProductStatus.toPmsTypeDataVo();
    }

    /**
     * 查询产品状态列表
     *
     * @param pmsProductStatus 产品状态
     * @return 产品状态
     */
    @Override
    public List<PmsTypeDataVo> selectPmsProductStatusList(PmsProductStatus pmsProductStatus) {
        List<PmsProductStatus> pmsProductStatusList = pmsProductStatusMapper.selectPmsProductStatusList(pmsProductStatus);
        if (pmsProductStatusList != null) {
            return pmsProductStatusList.stream().map(PmsProductStatus::toPmsTypeDataVo).collect(Collectors.toList());
        }
        return null;
    }

    /**
     * 新增产品状态
     *
     * @param pmsProductStatus 产品状态
     * @return 结果
     */
    @Override
    public int insertPmsProductStatus(PmsProductStatus pmsProductStatus) {
        pmsProductStatus.setCreateTime(DateUtils.getNowDate());
        return pmsProductStatusMapper.insertPmsProductStatus(pmsProductStatus);
    }

    /**
     * 修改产品状态
     *
     * @param pmsProductStatus 产品状态
     * @return 结果
     */
    @Override
    public int updatePmsProductStatus(PmsProductStatus pmsProductStatus) {
        pmsProductStatus.setUpdateTime(DateUtils.getNowDate());
        return pmsProductStatusMapper.updatePmsProductStatus(pmsProductStatus);
    }

    /**
     * 批量删除产品状态
     *
     * @param ids 需要删除的产品状态主键
     * @return 结果
     */
    @Override
    public int deletePmsProductStatusByIds(Long[] ids) {
        return pmsProductStatusMapper.deletePmsProductStatusByIds(ids);
    }

    /**
     * 删除产品状态信息
     *
     * @param id 产品状态主键
     * @return 结果
     */
    @Override
    public int deletePmsProductStatusById(Long id) {
        return pmsProductStatusMapper.deletePmsProductStatusById(id);
    }

    @Override
    public Long selectPmsProductDefaultStatusId(Integer type) {
        PmsProductStatus pmsProductStatus = pmsProductStatusMapper.selectPmsProductDefaultStatusByType(type);
        return pmsProductStatus.getId();
    }

    @Override
    public Long selectPmsProductStatusIdByInputId(Long statusId, Integer type) {
        if (statusId == null) {
            PmsProductStatus pmsProductStatus = pmsProductStatusMapper.selectPmsProductDefaultStatusByType(type);
            return pmsProductStatus.getId();
        }
        PmsTypeDataVo pmsTypeDataVo = selectPmsProductStatusById(statusId);
        if (pmsTypeDataVo.getType().equals(type)) {
            return pmsTypeDataVo.getId();
        }
        throw new ServiceException("该状态不存在(状态Id[%d])", statusId);
    }

    @Override
    public Long selectPmsProductPlanStatusByDateOrStatusId(Date startTime, Date endTime, Date oldStartTime, Date oldEndTime, Long statusId, Long oldStatusId) {
        // 未启动状态Id
        Long notStartedStatusId = selectPmsProductStatusByNameAndType(PmsConstants.PRODUCT_PLAN_NOT_STARTED_STATUS_NAME, PmsConstants.PRODUCT_STATUS_OR_PRIORITY_PLAN_TYPE);
        // 已过期状态Id
        Long expiredStatusId = selectPmsProductStatusByNameAndType(PmsConstants.PRODUCT_PLAN_EXPIRED_STATUS_NAME, PmsConstants.PRODUCT_STATUS_OR_PRIORITY_PLAN_TYPE);
        // 进行中状态Id
        Long inProgressStatusId = selectPmsProductStatusByNameAndType(PmsConstants.PRODUCT_PLAN_IN_PROGRESS_STATUS_NAME, PmsConstants.PRODUCT_STATUS_OR_PRIORITY_PLAN_TYPE);
        // 已完成状态Id
        Long completedStatusId = selectPmsProductStatusByNameAndType(PmsConstants.PRODUCT_PLAN_COMPLETED_STATUS_NAME, PmsConstants.PRODUCT_STATUS_OR_PRIORITY_PLAN_TYPE);
        // 已关闭状态Id
        Long closedStatusId = selectPmsProductStatusByNameAndType(PmsConstants.PRODUCT_PLAN_CLOSED_STATUS_NAME, PmsConstants.PRODUCT_STATUS_OR_PRIORITY_PLAN_TYPE);
        if(statusId!=null){
            if (oldStatusId.equals(notStartedStatusId) || oldStatusId.equals(expiredStatusId) || oldStatusId.equals(inProgressStatusId)) {
                if (!statusId.equals(completedStatusId) && !statusId.equals(closedStatusId)) {
                    throw new ServiceException("产品计划状态仅允许手动切换为已完成");
                }
            }
            if (oldStatusId.equals(completedStatusId) || oldStatusId.equals(closedStatusId)) {
                if (!statusId.equals(inProgressStatusId)) {
                    throw new ServiceException("产品计划状态在已完成状态下仅允许进行重开计划操作");
                }
            }
        }
        if (statusId != null && !completedStatusId.equals(oldStatusId) && !statusId.equals(inProgressStatusId)) {
            return statusId;
        } else {
            Date nowZeroTime = DateUtils.getZeroDate(DateUtils.getNowDate());
            Date startZeroTime = getZeroDate(startTime, oldStartTime);
            Date endZeroTime = getZeroDate(endTime, oldEndTime);
            if (nowZeroTime.before(startZeroTime)) {
                // 若当前时间在开始时间之前则为未启动状态
                return notStartedStatusId;
            } else if (nowZeroTime.after(endZeroTime)) {
                // 若当前时间在结束时间之后则为已过期状态
                return expiredStatusId;
            } else {
                // 若当前时间开始时间和结束时间之间则为进行中状态
                return inProgressStatusId;
            }
        }
    }

    private Date getZeroDate(Date time, Date defaultTime) {
        return (time != null) ? DateUtils.getZeroDate(time) : DateUtils.getZeroDate(defaultTime);
    }



    @Override
    public Long selectPmsProductStatusByNameAndType(String name, Integer type) {
        PmsProductStatus pmsProductStatus = pmsProductStatusMapper.selectPmsProductStatusByNameAndType(name, type);
        return pmsProductStatus.getId();
    }
}
