package com.ruoyi.project.process.service.impl;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.List;

import com.ruoyi.project.process.controller.vo.DelayVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.project.process.mapper.TMocMapper;
import com.ruoyi.project.process.domain.TMoc;
import com.ruoyi.project.process.service.ITMocService;

/**
 * MOC管理Service业务层处理
 *
 * @author ruoyi
 * @date 2020-12-07
 */
@Service
public class TMocServiceImpl implements ITMocService
{
    @Autowired
    private TMocMapper tMocMapper;

    /**
     * 查询MOC管理
     *
     * @param id MOC管理ID
     * @return MOC管理
     */
    @Override
    public TMoc selectTMocById(Long id)
    {
        return tMocMapper.selectTMocById(id);
    }

    /**
     * 查询MOC管理列表
     *
     * @param tMoc MOC管理
     * @return MOC管理
     */
    @Override
    public List<TMoc> selectTMocList(TMoc tMoc)
    {
        return tMocMapper.selectTMocList(tMoc);
    }

    /**
     * 新增MOC管理
     *
     * @param tMoc MOC管理
     * @return 结果
     */
    @Override
    public int insertTMoc(TMoc tMoc)
    {
        return tMocMapper.insertTMoc(tMoc);
    }

    /**
     * 修改MOC管理
     *
     * @param tMoc MOC管理
     * @return 结果
     */
    @Override
    public int updateTMoc(TMoc tMoc)
    {
        // 历史MOC数据对象
        TMoc history = tMocMapper.selectTMocById(tMoc.getId());

        String tempState = tMoc.getTempState() == null ? "-1" : tMoc.getTempState();
        String status = tMoc.getStatus() == null ? "-1" : tMoc.getStatus();
        String historyTempState = history.getTempState() == null ? "-1" : history.getTempState();
        String historyStatus = history.getStatus() == null ? "-1" : history.getStatus();

        // 临时MOC状态/卡具状态为“0-移除”，并且与历史值不一致
        if (tempState.equals("0") && !historyTempState.equals(tempState)
            || status.equals("0") && !historyStatus.equals(status)) {
            // 更新移除时间
//            tMoc.setRemoveTime(new Date());
        } else {
            // 清除移除时间
            tMoc.setRemoveTime(null);
        }

        return tMocMapper.updateTMoc(tMoc);
    }

    /**
     * 延期操作
     *
     * @param delayVO 前台请求数据传输对象
     * @return 结果
     */
    @Override
    public int delay(DelayVO delayVO) {
        TMoc tMoc = tMocMapper.selectTMocById(delayVO.getId());
        Date sealDate = tMoc.getSealDate();
        Date extention1 = tMoc.getExtention1();
        Date extention2 = tMoc.getExtention2();
        Date extention3 = tMoc.getExtention3();
        Date extention4 = tMoc.getExtention4();
        Date extention5 = tMoc.getExtention5();
        Date extention6 = tMoc.getExtention6();
        Date extention7 = tMoc.getExtention7();
        Date extention8 = tMoc.getExtention8();
        Date extention9 = tMoc.getExtention9();
        Date extention = null;
        // 延期日期为空，自动延期六个月
        if (delayVO.getExtention() == null) {
            Date now = null;
            if (extention9 != null) {
                now = extention9;
            } else if (extention8 != null) {
                now = extention8;
            } else if (extention7 != null) {
                now = extention7;
            } else if (extention6 != null) {
                now = extention6;
            } else if (extention5 != null) {
                now = extention5;
            } else if (extention4 != null) {
                now = extention4;
            } else if (extention3 != null) {
                now = extention3;
            } else if (extention2 != null) {
                now = extention2;
            } else if (extention1 != null) {
                now = extention1;
            } else if (sealDate != null) {
                now = sealDate;
            }
            extention = this.addSixMonth(now);
        } else {    // 手动延期
            extention = delayVO.getExtention();
        }
        // 到期时间修改为延期时间加6个月
        tMoc.setExpTime(this.addSixMonth(extention));
        // 判断第几次延期
        if (tMoc.getExtention1() == null) {
            tMoc.setExtention1(extention);
        } else {
            if (tMoc.getExtention2() == null) {
                tMoc.setExtention2(extention);
            } else {
                if (tMoc.getExtention3() == null) {
                    tMoc.setExtention3(extention);
                } else {
                    if (tMoc.getExtention4() == null) {
                        tMoc.setExtention4(extention);
                    } else {
                        if (tMoc.getExtention5() == null) {
                            tMoc.setExtention5(extention);
                        } else {
                            if (tMoc.getExtention6() == null) {
                                tMoc.setExtention6(extention);
                            } else {
                                if (tMoc.getExtention7() == null) {
                                    tMoc.setExtention7(extention);
                                } else {
                                    if (tMoc.getExtention8() == null) {
                                        tMoc.setExtention8(extention);
                                    } else {
                                        if (tMoc.getExtention9() == null) {
                                            tMoc.setExtention9(extention);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return this.updateTMoc(tMoc);
    }

    /**
     * 日期加6个月
     *
     * @param inputDate 输入日期
     * @return 输出日期
     */
    private Date addSixMonth(Date inputDate) {
        int year = inputDate.getYear();
        int month = inputDate.getMonth();
        int date = inputDate.getDate();
        // 3.31 => 9.30
        // 5.31 => 11.30
        // 10.31 => 4.30
        // 12.31 => 6.30
        if (month == 2 || month == 4 || month == 9 || month == 11) {
            if (date == 31) {
                date = 30;
            }
        }
        // 8.31 => 2.28/29
        if (month == 7) {
            if ((year + 1) % 4 == 0) {  // 闰年
                if (date > 29) {
                    date = 29;
                }
            } else {    // 非闰年
                if (date > 28) {
                    date = 28;
                }
            }
        }
        month += 6;
        return new Date(year, month, date);
    }

    /**
     * 批量删除MOC管理
     *
     * @param ids 需要删除的MOC管理ID
     * @return 结果
     */
    @Override
    public int deleteTMocByIds(Long[] ids)
    {
        return tMocMapper.deleteTMocByIds(ids);
    }

    /**
     * 删除MOC管理信息
     *
     * @param id MOC管理ID
     * @return 结果
     */
    @Override
    public int deleteTMocById(Long id)
    {
        return tMocMapper.deleteTMocById(id);
    }
}
