package com.ruoyi.course.service.impl;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.RestResponse;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.model.AppLoginUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.course.domain.*;
import com.ruoyi.course.domain.enums.ClaTimeAttendStatusEnums;
import com.ruoyi.course.domain.enums.ClaTimeStatusEnums;
import com.ruoyi.course.domain.enums.CourseChargeTypeEnum;
import com.ruoyi.course.domain.enums.LogTypeEnum;
import com.ruoyi.course.domain.req.ReqClaTimeAttend;
import com.ruoyi.course.domain.req.ReqClaTimeAttendItem;
import com.ruoyi.course.mapper.ScClaTimeMapper;
import com.ruoyi.course.mapper.ScStudentCourseMapper;
import com.ruoyi.course.service.IScCourseClaService;
import com.ruoyi.course.service.IScCourseService;
import com.ruoyi.course.service.ScClaTimeService;
import com.ruoyi.course.service.ScStudentCourseService;
import com.ruoyi.system.service.ISysDeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

@Service
public class StudentCourseServiceImpl extends ServiceImpl<ScStudentCourseMapper, ScStudentCourse> implements ScStudentCourseService {




    @Autowired
    private IScCourseClaService claService;

    @Autowired
    private ISysDeptService deptService;

    @Autowired
    private IScCourseService courseService;

    @Autowired
    private ScStudentCourseMapper studentCourseMapper;

    @Autowired
    private ScClaTimeService claTimeService;

    /**
     * 记上课
     *
     * @param reqClaTimeAttend
     * @return
     */
    @Override
    public RestResponse claTimeAttend(ReqClaTimeAttend reqClaTimeAttend) {
//        APIResponse checkParam = reqClaTimeAttend.checkParam();
//        if (!checkParam.isSuccess()) {
//            return checkParam;
//        }
//        AppLoginUser loginUser = SecurityUtils.getAppLoginUser();
//        String attendType = reqClaTimeAttend.getAttendType();
//        String startTime = reqClaTimeAttend.getStartTime();
//        String endTime = reqClaTimeAttend.getEndTime();
//        Long teacherId = reqClaTimeAttend.getTeacherId();
//        Long courseTimeId = reqClaTimeAttend.getCourseTimeId();
//        Long claId = reqClaTimeAttend.getClaId();
//        ScCourseCla dbCla = claService.getById(claId);
//        if (null == dbCla) {
//            return new RestResponse().setSuccess(false).setMessage("无法获取班级信息,请稍后重试");
//        }
//        Long courseId = dbCla.getCourseId();
//        ScCourse scCourse = courseService.getById(courseId);
//        if (null == scCourse) {
//            return new RestResponse().setSuccess(false).setMessage("无法获取班级信息,请稍后重试");
//        }
//
//        Long departId = dbCla.getDepartId();
//        SysDept sysDept = deptService.getById(departId);
//        if (null == sysDept) {
//            return new RestResponse().setSuccess(false).setMessage("无法获取校区信息,请稍后重试");
//        }
//
//        List<ReqClaTimeAttendItem> studentAttendList = reqClaTimeAttend.getStudentAttendList();
//
//        // 总消耗课时金额
//        BigDecimal totalPayFee = BigDecimal.ZERO;
//        // 可课时消耗
//        BigDecimal totalPayHour = BigDecimal.ZERO;
//        // 实到人数
//        Long realAttendCnt = studentAttendList.stream().filter(item -> item.getAttendStatus().equals(ClaTimeAttendStatusEnums.AT_CLASS.getAttendStatus())).count();
//        // 请假人数
//        Long leaveCnt = studentAttendList.stream().filter(item -> item.getAttendStatus().equals(ClaTimeAttendStatusEnums.LEAVE_CLASS.getAttendStatus())).count();
//        // 旷课人数
//        Long outCnt = studentAttendList.stream().filter(item -> item.getAttendStatus().equals(ClaTimeAttendStatusEnums.OUT_CLASS.getAttendStatus())).count();
//        // 应到人数
//        int needAttendCnt = studentCourseMapper.selectClaNeedAttendCnt(dbCla.getClaId());
//
//
//        if ("rule".equals(attendType)) {
//            // 排课记上课
//
//            ScClaTime claTime = claTimeService.getById(courseTimeId);
//            if (!ClaTimeStatusEnums.WAIT_CLASS.getStatus().equals(claTime.getStatus())) {
//                return new RestResponse().setSuccess(false).setMessage("选择计划上课日期,非待上课状态,无法重复上课!");
//            }
//            teacherId = claTime.getTeacherId();
//            // 变更状态为已上课
//            ScClaTime updateClaTime = new ScClaTime();
//            updateClaTime.setCourseTimeId(courseTimeId);
//            updateClaTime.setRealClaDate(claTime.getClaDate());
//            updateClaTime.setRealStartTime(startTime);
//            updateClaTime.setRealEndTime(endTime);
//            updateClaTime.setStatus(ClaTimeStatusEnums.HAD_CLASS.getStatus());
////            updateClaTime.setNeedAttendCnt(needAttendCnt);
//            updateClaTime.setRealAttendCnt(realAttendCnt.intValue());
//            updateClaTime.setMemo(reqClaTimeAttend.getMemo());
//            updateClaTime.setLastUpdateUser(loginUser.getAppUserId());
//            updateClaTime.setLastUpdateTime(new Date());
//            claTimeService.updateById(updateClaTime);
//        } else if ("change".equals(attendType)) {
//            // 变更上课记录
//
//            ScClaTime claTime = claTimeService.getById(courseTimeId);
//            if (!ClaTimeStatusEnums.WAIT_CLASS.getStatus().equals(claTime.getStatus())) {
//                return APIResponse.toExceptionResponse("选择计划上课日期,非待上课状态,无法重复上课!");
//            }
//            // 变更状态为已上课
//            ScClaTime updateClaTime = new ScClaTime();
//            updateClaTime.setCourseTimeId(courseTimeId);
//            updateClaTime.setRealClaDate(reqClaTimeAttend.getClaDate());
//            updateClaTime.setTeacherId(reqClaTimeAttend.getTeacherId());
//            updateClaTime.setClassTheme(reqClaTimeAttend.getClassTheme());
//            updateClaTime.setRealStartTime(startTime);
//            updateClaTime.setRealEndTime(endTime);
//            updateClaTime.setStatus(ClaTimeStatusEnums.HAD_CLASS.getStatus());
////            updateClaTime.setNeedAttendCnt(needAttendCnt);
//            updateClaTime.setRealAttendCnt(realAttendCnt.intValue());
//            updateClaTime.setMemo(reqClaTimeAttend.getMemo());
//            updateClaTime.setLastUpdateUser(loginUser.getAppUserId());
//            updateClaTime.setLastUpdateTime(new Date());
//            claTimeService.updateById(updateClaTime);
//        } else if ("custom".equals(attendType)) {
//            // 记录自定义上课信息
//
//            ScClaTime addClaTime = new ScClaTime();
//            addClaTime.setClaId(reqClaTimeAttend.getClaId());
//            addClaTime.setClaDate(reqClaTimeAttend.getClaDate());
//            addClaTime.setTeacherId(reqClaTimeAttend.getTeacherId());
//            addClaTime.setClassTheme(reqClaTimeAttend.getClassTheme());
//            addClaTime.setStartTime(reqClaTimeAttend.getStartTime());
//            addClaTime.setEndTime(reqClaTimeAttend.getEndTime());
//            addClaTime.setRealClaDate(reqClaTimeAttend.getClaDate());
//            addClaTime.setRealStartTime(reqClaTimeAttend.getStartTime());
//            addClaTime.setRealEndTime(reqClaTimeAttend.getEndTime());
//            addClaTime.setSource(ClaTimeSourceEnums.UN_PLAN_CLA_TIME.getSource());
//            addClaTime.setStatus(ClaTimeStatusEnums.HAD_CLASS.getStatus());
//            addClaTime.setPayHour(dbCla.getEveryStuLoseHour());
//            addClaTime.setNeedAttendCnt(needAttendCnt);
//            addClaTime.setRealAttendCnt(realAttendCnt.intValue());
//            addClaTime.setMemo(reqClaTimeAttend.getMemo());
//            addClaTime.setCreateUser(loginUser.getUserId());
//            addClaTime.setCreateTime(new Date());
//            addClaTime.setLastUpdateUser(loginUser.getUserId());
//            addClaTime.setLastUpdateTime(new Date());
//
//            // 教室不为空 设置教室
//            if (null != reqClaTimeAttend.getRoomId()) {
//                ScRoom room = roomService.getById(reqClaTimeAttend.getRoomId());
//                addClaTime.setRoomId(reqClaTimeAttend.getRoomId());
//                addClaTime.setRoomName(room.getRoomName());
//            }
//
//            claTimeService.save(addClaTime);
//            courseTimeId = addClaTime.getCourseTimeId();
//        }
//
//        // 教师信息
//        SysStaff sysStaff = staffService.getById(teacherId);
//
//        // 保存上课记录
//        List<ScClaTimeAttend> saveAttendList = com.google.common.collect.Lists.newArrayList();
//        // 保存学生日志
//        List<ScStudentCourseLog> studentCourseLogList = com.google.common.collect.Lists.newArrayList();
//
//        for (ReqClaTimeAttendItem attendItem : studentAttendList) {
//            Long studentCourseId = attendItem.getStudentCourseId();
//            String attendStatus = attendItem.getAttendStatus();
//            String memo = attendItem.getMemo();
//            BigDecimal stuLoseHour = attendItem.getStuLoseHour();
//
//            // 如果是请假,消耗课时0
//            if (ClaTimeAttendStatusEnums.LEAVE_CLASS.getAttendStatus().equals(attendStatus)) {
//                stuLoseHour = BigDecimal.ZERO;
//            }
//
//            // 获取学生报读班级信息
//            ScStudentCourse studentCourse = studentCourseService.getById(studentCourseId);
//            String studentDbChargeType = studentCourse.getChargeType();
//
//            // 消耗金额
//            BigDecimal payFee;
//            // 上课后剩余课时
//            BigDecimal changeAfterBalanceHour = null;
//            // 本次上课对应的订单
//            Long courseOrderId = null;
//
//            if (CourseChargeTypeEnum.DATE.getChargeType().equals(studentDbChargeType)) {
//                // 按时间上课，不扣减课时
//
//                // 获取 消耗金额
//                ScStudentCourseOrder courseOrder = courseOrderService.getNowValidDateOrder(studentCourseId);
//                payFee = courseOrder.getUnitFee();
//                courseOrderId = courseOrder.getCourseOrderId();
//
//            } else {
//                // 本次上课对应的订单
//                ScStudentCourseOrder courseOrder = courseOrderService.getSubtractHourOrder(studentCourseId);
//                if (null == courseOrder) {
//                    throw new BusinessException("无法获取对应课时订单,无法扣减课时,id=" + studentCourseId);
//                }
//                courseOrderId = courseOrder.getCourseOrderId();
//
//                BigDecimal balanceHour = studentCourse.getBalanceHour();
//                balanceHour = balanceHour.subtract(stuLoseHour);
//
//                changeAfterBalanceHour = balanceHour;
//
//                // 课时不足 不允许上课
//                if (balanceHour.compareTo(BigDecimal.ZERO) < 0) {
//                    throw new BusinessException("学员课时不足,不允许上课!");
//                }
//
//                // 更新剩余课时 cas
//                UpdateWrapper<ScStudentCourse> uwStudentCourse = new UpdateWrapper<>();
//                uwStudentCourse
//                        .eq("student_course_id", studentCourseId)
//                        .eq("balance_hour", studentCourse.getBalanceHour())
//                        .set("balance_hour", balanceHour)
//                        .set("last_update_user", loginUser.getUserId())
//                        .set("last_update_time", new Date());
//                boolean update = studentCourseService.update(uwStudentCourse);
//                if (!update) {
//                    throw new BusinessException("学员课时余额扣减失败,请重试!");
//                }
//
//                // 订单扣减课时，获取 消耗金额
//                payFee = courseOrderService.subtractCourseOrderBalanceHour(studentCourseId, stuLoseHour);
//            }
//
//            // 消耗总金额
//            totalPayFee = totalPayFee.add(payFee);
//
//            // 每个上课记录
//            ScClaTimeAttend addClaTimeAttend = new ScClaTimeAttend();
//            addClaTimeAttend.setStudentCourseId(studentCourseId);
//            addClaTimeAttend.setCourseOrderId(courseOrderId);
//            addClaTimeAttend.setCourseTimeId(courseTimeId);
//            addClaTimeAttend.setStudentId(studentCourse.getStudentId());
//            addClaTimeAttend.setClaId(studentCourse.getClaId());
//            addClaTimeAttend.setCourseId(studentCourse.getCourseId());
//            addClaTimeAttend.setTeacherId(teacherId);
//            addClaTimeAttend.setTeacherName(sysStaff.getStaffName());
//            addClaTimeAttend.setChargeType(studentDbChargeType);
//            if (CourseChargeTypeEnum.DATE.getChargeType().equals(studentDbChargeType)) {
//                addClaTimeAttend.setTeacherGetHour(null);
//                addClaTimeAttend.setPayHour(null);
//            } else {
//                addClaTimeAttend.setTeacherGetHour(stuLoseHour);
//                addClaTimeAttend.setPayHour(stuLoseHour);
//                totalPayHour = totalPayHour.add(stuLoseHour);
//            }
//            addClaTimeAttend.setAttendStatus(attendStatus);
//            addClaTimeAttend.setMemo(memo);
//            addClaTimeAttend.setCreateUser(loginUser.getUserId());
//            addClaTimeAttend.setPayFee(payFee);
//            saveAttendList.add(addClaTimeAttend);
//
//            // 上课日志
//            StringBuffer sb = new StringBuffer("");
//            sb.append("上课[").append(ClaTimeAttendStatusEnums.getNameByStatus(attendStatus)).append("],上课时间").append(reqClaTimeAttend.getClaDate()).append(" ")
//                    .append(reqClaTimeAttend.getStartTime()).append("~").append(reqClaTimeAttend.getEndTime()).append(",");
//            ScStudentCourseLog studentCourseLog = ScStudentCourseLog.builder()
//                    .studentId(studentCourse.getStudentId())
//                    .logType(LogTypeEnum.ATTEND_CLA.getLogType())
//                    .courseId(scCourse.getCourseId())
//                    .courseName(scCourse.getCourseName())
//                    .claId(dbCla.getClaId())
//                    .claName(dbCla.getClaName())
//                    .deptName(sysDept.getDeptName())
//                    .changeFee(payFee.negate())
//                    .createUser(loginUser.getUserId())
//                    .createUserName(loginUser.getName())
//                    .createTime(new Date())
//                    .build();
//            if (!CourseChargeTypeEnum.DATE.getChargeType().equals(studentDbChargeType)) {
//                studentCourseLog.setChangeHour(stuLoseHour.negate());
//                studentCourseLog.setAfterBalanceHour(changeAfterBalanceHour);
//                sb.append("扣减").append(stuLoseHour.toString()).append("课时,");
//                sb.append("消耗").append(payFee).append("元.");
//            }
//            studentCourseLog.setMemo(sb.toString());
//            studentCourseLogList.add(studentCourseLog);
//        }
//        // 保存上课记录
//        attendService.saveBatch(saveAttendList);
//        // 保存学生日志
//        scStudentCourseLogService.saveBatch(studentCourseLogList);
//
//        // 更新上课总课时 人数信息
//        ScClaTime updateClaTime = new ScClaTime();
//        updateClaTime.setCourseTimeId(courseTimeId);
//        updateClaTime.setPayTotalHour(totalPayHour);
//        updateClaTime.setPayTotalFee(totalPayFee);
//        updateClaTime.setAtClassCnt(realAttendCnt.intValue());
//        updateClaTime.setLeaveCnt(leaveCnt.intValue());
//        updateClaTime.setOutCnt(outCnt.intValue());
//        claTimeService.updateById(updateClaTime);
//
//        return APIResponse.toOkResponse();
        return new RestResponse();
    }

}
