package com.mortals.xhx.module.attendance.service.impl;

import cn.hutool.core.date.DateUtil;
import com.mortals.framework.service.ICacheService;
import com.mortals.framework.util.DateUtils;
import com.mortals.framework.util.ThreadPool;
import com.mortals.xhx.common.code.AppealResultEnum;
import com.mortals.xhx.common.code.AuditStatusEnum;
import com.mortals.xhx.common.utils.AddAttendThread;
import com.mortals.xhx.common.utils.AttendSummaryThread;
import com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordQuery;
import com.mortals.xhx.module.attendance.model.AttendanceRecordHikEntity;
import com.mortals.xhx.module.attendance.model.AttendanceRecordHikQuery;
import com.mortals.xhx.module.attendance.model.vo.AttendanceSummaryQuery;
import com.mortals.xhx.module.attendance.service.AttendanceRecordHikService;
import com.mortals.xhx.module.attendance.service.AttendanceStatService;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.xhx.module.attendance.dao.AttendanceLeaveRecordDao;
import com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordEntity;
import com.mortals.xhx.module.attendance.service.AttendanceLeaveRecordService;

import java.util.Date;

import static com.mortals.xhx.common.key.RedisKey.KEY_ATTENDANCE_STAT_CACHE;

/**
 * AttendanceLeaveRecordService
 * 请假记录信息 service实现
 *
 * @author zxfei
 * @date 2023-04-07
 */
@Service("attendanceLeaveRecordService")
public class AttendanceLeaveRecordServiceImpl extends AbstractCRUDServiceImpl<AttendanceLeaveRecordDao, AttendanceLeaveRecordEntity, Long> implements AttendanceLeaveRecordService {

    @Autowired
    private AttendanceStatService attendanceStatService;
    @Autowired
    private ICacheService cacheService;

    @Autowired
    private AttendanceRecordHikService hikService;

    @Override
    protected void updateAfter(AttendanceLeaveRecordEntity entity, Context context) throws AppException {
        super.updateAfter(entity, context);
/*        //context!=null时表示页面调用的修改，自动执行处理任务调用时context为null，无需立即汇总
        if (entity.getAuditResult() == 1 && context != null) {
            AttendanceSummaryQuery query = new AttendanceSummaryQuery();
            query.setStaffId(entity.getLeavePersonId());
            query.setSummaryTimeStart(DateUtils.getStrDate(entity.getStartTime()));
            query.setSummaryTimeEnd(DateUtils.getStrDate(entity.getEndTime()));
            cacheService.lpush(KEY_ATTENDANCE_STAT_CACHE, query);
        }*/

        doUpdateRecordAndSummary(entity, context);
    }

    @Override
    public AttendanceLeaveRecordEntity doUpdateRecord(String processInstanceId, AttendanceLeaveRecordEntity leaveRecordEntity) throws Exception {
        synchronized (this) {
            AttendanceLeaveRecordEntity recordEntity = this.selectOne(new AttendanceLeaveRecordQuery().remark(processInstanceId));
            if (ObjectUtils.isEmpty(recordEntity)) {
                leaveRecordEntity.setCreateTime(new Date());
                leaveRecordEntity.setCreateUserId(1L);
                this.save(leaveRecordEntity);
            } else {
                leaveRecordEntity.setId(recordEntity.getId());

                leaveRecordEntity.setUpdateUserId(1L);
                leaveRecordEntity.setUpdateTime(new Date());

                this.update(leaveRecordEntity);
            }
            return leaveRecordEntity;
        }
    }


    @Override
    protected void saveAfter(AttendanceLeaveRecordEntity entity, Context context) throws AppException {
        super.saveAfter(entity, context);

        doUpdateRecordAndSummary(entity, context);
    }

    /**
     * 更新汇总信息
     * @param entity
     * @param context
     */
    private void doUpdateRecordAndSummary(AttendanceLeaveRecordEntity entity, Context context) {
        //请假是未来 不做处理
        int compare = DateUtil.compare(entity.getStartTime(), new Date());
        if (compare > 0) {
            //请假未来 不做处理
            return;
        }
        //更新考勤记录与异常记录
        if (AppealResultEnum.通过.getValue() == entity.getAuditResult()||AppealResultEnum.撤销审批通过.getValue() == entity.getAuditResult()) {
            AttendanceRecordHikQuery attendanceRecordHikQuery = new AttendanceRecordHikQuery();
            attendanceRecordHikQuery.setStaffId(entity.getLeavePersonId());
            //判断请假的开始日期与结束日期
            boolean in = DateUtil.isIn(new Date(), entity.getEndTime(), new Date());
            if (in) {
                //当前日期在请假期间，计算考勤结束时间为当前时间;
                attendanceRecordHikQuery.setAttendanceDateStart(DateUtil.formatDate(entity.getStartTime()));
                attendanceRecordHikQuery.setAttendanceDateEnd(DateUtil.today());
            }else{
                attendanceRecordHikQuery.setAttendanceDateStart(DateUtil.formatDate(entity.getStartTime()));
                attendanceRecordHikQuery.setAttendanceDateEnd(DateUtil.formatDate(entity.getEndTime()));
            }
            AddAttendThread addAttendThread = new AddAttendThread(hikService, attendanceRecordHikQuery, context);
            ThreadPool.getInstance().execute(addAttendThread);
        }
    }
}