package com.jevon.controller;

import com.alibaba.fastjson.JSONObject;
import com.jevon.model.*;
import com.jevon.service.*;
import com.jevon.utils.HttpClientUtils;
import com.jevon.vo.BaseVo;
import com.jevon.vo.rep.InitRepVo;
import com.jevon.vo.rep.ScheduleRepVo;
import com.jevon.vo.req.CreateScheduleReqVo;
import com.jevon.vo.req.InitTeacherCourseReqVo;
import com.jevon.vo.req.ScheduleIdReqVo;
import com.jevon.vo.req.UpdateScheduleReqVo;
import com.sun.xml.bind.v2.runtime.unmarshaller.IntArrayData;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileInputStream;
import java.util.*;

@RestController
@RequestMapping(value = "/init")
@Api(value = "排课表")
public class ScheduleInitController {

    @Autowired
    ClassModelService classModelService;

    @Autowired
    TeacherClassService teacherClassService;

    @Autowired
    CourseService courseService ;

    @Autowired
    TeacherService teacherService;

    @Autowired
    ScheduleService scheduleService;

    @Autowired
    TeacherCourseService teacherCourseService;

    @Autowired
    JoinClassService joinClassService;

    @Autowired
    ClassCourseService classCourseService;

    @Value("${remoting.url}")
    private String url ;
    @Value("${remoting.prefixFile}")
    private String staticUrl ;

    @ApiOperation("创建排课计划 ")
    @RequestMapping(value = "createSchedule", method = RequestMethod.POST)
    public ScheduleRepVo createSchedule(HttpServletRequest request){
        ScheduleRepVo baseVo = new ScheduleRepVo();
        Schedule schedule = new Schedule();
        schedule.setTeam(request.getParameter("team"));
        schedule.setScheduleName(request.getParameter("scheduleName"));
        schedule.setSchoolId(Integer.valueOf(request.getParameter("schoolId")));
        Schedule temp = scheduleService.selectBySchoolAndTeam(schedule);
        if(temp == null){
            scheduleService.insert(schedule);
        }else {
            baseVo.setSuccess(false);
            baseVo.setMessage("该学校该学年学期已创建了排课计划");
            return baseVo;
        }
        temp = scheduleService.selectBySchoolAndTeam(schedule);
        initMessage(schedule.getSchoolId());
        baseVo.setScheduleId(temp.getId());
        return baseVo;
    }

    @ApiOperation("更新计划")
    @RequestMapping(value = "updateSchedule", method = RequestMethod.POST)
    public BaseVo updateSchedule(@RequestBody UpdateScheduleReqVo updateScheduleReqVo){
        BaseVo baseVo = new BaseVo();
        Schedule schedule = scheduleService.selectById(updateScheduleReqVo.getScheduleId());
        schedule.setScheduleName(updateScheduleReqVo.getScheduleName());
        schedule.setTeam(updateScheduleReqVo.getTeam());
        scheduleService.update(schedule);
        return baseVo;
    }

    @ApiOperation("复制")
    @RequestMapping(value = "copySchedule", method = RequestMethod.POST)
    public BaseVo copySchedule(@RequestBody UpdateScheduleReqVo updateScheduleReqVo){
        BaseVo baseVo = new BaseVo();
        Schedule schedule = scheduleService.selectById(updateScheduleReqVo.getScheduleId());
        if(schedule == null){
            baseVo.setMessage("原始课表不存在");
            baseVo.setSuccess(false);
            return  baseVo;
        }
        Schedule temp = new Schedule();
        temp.setSchoolId(schedule.getSchoolId());
        temp.setTeam(updateScheduleReqVo.getTeam());
        Schedule result = scheduleService.selectBySchoolAndTeam(temp);
        if(result != null){
            baseVo.setMessage("该学年学期已创建课表计划");
            baseVo.setSuccess(false);
            return  baseVo;
        }
        temp.setScheduleName(updateScheduleReqVo.getScheduleName());
        scheduleService.insert(temp);
        Date date = new Date();
        //复制 classCourse  teacherClass teacherCourse
        List<ClassCourse> classCourses = classCourseService.copyClassCourse(schedule.getSchoolId(),schedule.getTeam());
        for(ClassCourse classCourse :classCourses){
            classCourse.setSchoolId(temp.getSchoolId());
            classCourse.setTeam(temp.getTeam());
            classCourse.setCreateTime(date);
        }
        classCourseService.insertBatch(classCourses);
        TeacherClass teacherClass = new TeacherClass();
        teacherClass.setSchoolId(schedule.getSchoolId());
        teacherClass.setTeam(schedule.getTeam());
        List<TeacherClass> teacherClasses = teacherClassService.selectBySchoolAndTeam(teacherClass);
        for(TeacherClass teacherClass1 :teacherClasses){
            teacherClass1.setSchoolId(temp.getSchoolId());
            teacherClass1.setTeam(temp.getTeam());
            teacherClass1.setCreateTime(date);
        }
        teacherClassService.insertBatch(teacherClasses);

        List<TeacherCourse> teacherCourses = teacherCourseService.selectBySchoolIdAndTeam(schedule.getSchoolId(),schedule.getTeam());
        for(TeacherCourse teacherCourse : teacherCourses){
            teacherCourse.setSchoolId(temp.getSchoolId());
            teacherCourse.setTeam(temp.getTeam());
            teacherCourse.setCreateTime(date);
        }
        teacherCourseService.insertBatch(teacherCourses);
        return baseVo;
    }

    @ApiOperation("删除排课计划")
    @RequestMapping(value = "deleteSchedule", method = RequestMethod.POST)
    public BaseVo deleteSchedule(@RequestBody ScheduleIdReqVo scheduleIdReqVo){
        BaseVo baseVo = new BaseVo();
        Schedule schedule = scheduleService.selectById(scheduleIdReqVo.getScheduleId());
        if(schedule == null){
            baseVo.setSuccess(false);
            baseVo.setMessage("无排课计划");
            return  baseVo;
        }
        teacherCourseService.deleteBySchoolIdAndTeam(schedule.getSchoolId(),schedule.getTeam());
        joinClassService.deleteBySchoolIdAndTeam(schedule.getSchoolId(),schedule.getTeam());
        classCourseService.deleteBySchoolIdAndTeam(schedule.getSchoolId(),schedule.getTeam());
        TeacherClass teacherClass = new TeacherClass();
        teacherClass.setSchoolId(schedule.getSchoolId());
        teacherClass.setTeam(schedule.getTeam());
        teacherClassService.deleteBySchoolAndTeam(teacherClass);
        courseService.initSchoolId(schedule.getSchoolId());
        scheduleService.deleteBySchedule(schedule.getId());
        return baseVo;
    }

    @ApiOperation("获取基础信息")
    @RequestMapping(value = "getInitMessage", method = RequestMethod.POST)
    public InitRepVo getInitMessage(@RequestBody ScheduleIdReqVo scheduleIdReqVo){
        InitRepVo initRepVo = new InitRepVo();
        Schedule schedule = scheduleService.selectById(scheduleIdReqVo.getScheduleId());
        if(schedule == null){
            initRepVo.setSuccess(false);
            initRepVo.setMessage("没有改排课计划");
            return initRepVo;
        }
        List<Course> courses = courseService.selectBySchoolId2(schedule.getSchoolId());
        List<Teacher> teachers = teacherService.selectBySchoolId(schedule.getSchoolId());
        List<ClassModel> classModels = classModelService.selectBySchoolId(schedule.getSchoolId());
        initRepVo.setClassNumber(classModels.size());
        initRepVo.setCourseNumber(courses.size());
        initRepVo.setTeacherNumber(teachers.size());
        return initRepVo;
    }

    @Transactional
    @ApiOperation("教师授课信息")
    @RequestMapping(value = "initTeacherCourse", method = RequestMethod.POST)
    public BaseVo initTeacherCourse(@RequestBody InitTeacherCourseReqVo initTeacherCourseReqVo){
        BaseVo baseVo = new BaseVo();
        Date date = new Date();
        try{
            TeacherClass temp = new TeacherClass();
            Schedule schedule = scheduleService.selectById(initTeacherCourseReqVo.getScheduleId());
            if(schedule != null && schedule.getSpeed() == 2) {
                temp.setSchoolId(schedule.getSchoolId());
                temp.setTeam(schedule.getTeam());
                List<TeacherClass> list = teacherClassService.selectBySchoolAndTeam(temp);
                if (list != null && list.size() > 0) {
                    teacherClassService.deleteBySchoolAndTeam(temp);
                }
                String fileUrl = initTeacherCourseReqVo.getUrl();
                fileUrl = fileUrl.replace(url, staticUrl);
                File excelFile = new File(fileUrl);
                // 获得工作簿
                String file = excelFile.getName();
                Workbook workbook = null;
                if (file.endsWith("xls")) {
                    workbook = new HSSFWorkbook(new FileInputStream(excelFile));
                } else {
                    workbook = new XSSFWorkbook(new FileInputStream(excelFile));
                }
                // 获得工作表
                Sheet sheet = workbook.getSheetAt(0);
                int rows = sheet.getPhysicalNumberOfRows();
                Map<Integer, Course> courseTeacherMap = new HashMap<>();
                int courseNumber = 0;
                List<TeacherClass> teacherClasses = new ArrayList<>();
                for (int i = 0; i < rows; i++) {
                    // 获取第i行数据
                    Row sheetRow = sheet.getRow(i);
                    if (i == 0) {
                        //获取表头
                        int j = 1;
                        while (sheetRow.getCell(2 * j) != null && StringUtils.isNotBlank(sheetRow.getCell(2 * j).getStringCellValue().trim())) {
                            Course course = courseService.selectBySchoolIdAndCourseName(schedule.getSchoolId(), sheetRow.getCell(2 * j).getStringCellValue().trim());
                            courseTeacherMap.put(j, course);
                            j++;
                        }
                        courseNumber = j - 1;
                    } else {
                        if (StringUtils.isBlank(sheetRow.getCell(0).getStringCellValue().trim())) {
                            continue;
                        }
                        String className = sheetRow.getCell(1).getStringCellValue().trim();
                        ClassModel classModel = new ClassModel();
                        classModel.setSchoolId(schedule.getSchoolId());
                        classModel.setClassName(className);
                        classModel.setGrade(sheetRow.getCell(0).getStringCellValue().trim());
                        ClassModel resultClass = classModelService.selectBySchoolIdAndClassNameAndGrade(classModel);
                        for (int j = 1; j <= courseNumber; j++) {
                            Cell cell = sheetRow.getCell(2 * j);
                            if (cell != null) {
                                cell.setCellType(CellType.STRING);
                                String times = sheetRow.getCell(2 * j).getStringCellValue().trim();
                                if (StringUtils.isNotBlank((times))) {
                                    Course course = courseTeacherMap.get(j);
                                    String teacherName = sheetRow.getCell(2 * j + 1).getStringCellValue().trim();
                                    Teacher teacher = new Teacher();
                                    teacher.setTeacherName(teacherName);
                                    teacher.setSchoolId(schedule.getSchoolId());
                                    Teacher resultTeacher = teacherService.selectByTeacher(teacher);
                                    if (course != null && resultTeacher != null) {
                                        TeacherClass teacherClass = new TeacherClass();
                                        teacherClass.setTeam(schedule.getTeam());
                                        teacherClass.setSchoolId(schedule.getSchoolId());
                                        teacherClass.setCourseName(course.getCourseName());
                                        teacherClass.setTeacherName(resultTeacher.getTeacherName());
                                        teacherClass.setTeacherId(resultTeacher.getTeacherId());
                                        teacherClass.setGrade(sheetRow.getCell(0).getStringCellValue().trim());
                                        teacherClass.setClassId(resultClass.getClassId());
                                        String[] msg = times.split("\\+");
                                        if (msg.length > 1) {
                                            //有联课
                                            teacherClass.setJoinTimes(Integer.valueOf(msg[1]));
                                            teacherClass.setTimes(Integer.valueOf(msg[1]) * 2 + Integer.valueOf(msg[0]));
                                        } else {
                                            teacherClass.setJoinTimes(0);
                                            teacherClass.setTimes(Integer.valueOf(msg[0]));
                                        }
                                        teacherClass.setStatus(0);
                                        teacherClass.setCreateTime(date);
                                        teacherClasses.add(teacherClass);
                                    } else {
                                        baseVo.setMessage("课程或老师缺失");
                                        baseVo.setSuccess(false);
                                        return baseVo;
                                    }
                                }

                            }
                        }
                    }
                }
                teacherClassService.insertBatch(teacherClasses);
                schedule.setSpeed(3);
                scheduleService.updateSpeed(schedule);
            }else {
                baseVo.setMessage("排课计划不存在或已导入");
                baseVo.setSuccess(false);
            }
        }catch (Exception e){
            System.out.println(e);
            baseVo.setSuccess(false);
        }
        return baseVo;
    }

    private void initMessage(int schoolId){
        JSONObject teacherList = HttpClientUtils.httpGet(url+"/api/EasyN/GetSchoolTeacher?SchoolId="+schoolId);
        List<JSONObject> openTeacherList = (List<JSONObject>)teacherList.get("data");
        List<Teacher> teachers = new ArrayList<>();
        for(JSONObject json :openTeacherList){
            Teacher teacher = new Teacher();
            teacher.setSchoolId(Integer.valueOf(json.get("school_id").toString()));
            teacher.setTeacherId(Integer.valueOf(json.get("teacher_id").toString()));
            teacher.setTeacherName(json.get("name").toString());
            teachers.add(teacher);
        }
        initTeacher(teachers,schoolId);
        JSONObject classList = HttpClientUtils.httpGet(url+"/api/EasyN/GetSchoolClass?SchoolId="+schoolId);
        List<JSONObject> openClasses = (List<JSONObject>)classList.get("data");
        List<ClassModel> classModels = new ArrayList<>();
        for(JSONObject json :openClasses){
            ClassModel classModel = new ClassModel();
            classModel.setSchoolId(Integer.valueOf(json.get("school_id").toString()));
            classModel.setClassId(Integer.valueOf(json.get("class_id").toString()));
            classModel.setGrade(json.get("gardeName").toString());
            classModel.setClassName(json.get("class_name").toString());
            classModels.add(classModel);
        }
        initClass(classModels,schoolId);
        JSONObject courseList = HttpClientUtils.httpGet(url+"/api/EasyN/GetSchoolSubject?SchoolId="+schoolId);
        List<JSONObject> openCourses = (List<JSONObject>)courseList.get("data");
        List<Course> courses = new ArrayList<>();
        for(JSONObject json :openCourses){
            Course course = new Course();
            course.setSchoolId(Integer.valueOf(json.get("school_id").toString()));
            course.setCourseId(Integer.valueOf(json.get("subject_id").toString()));
            course.setCourseName(json.get("subject_name").toString());
            course.setCourseType(0);
            courses.add(course);
        }
        initCourse(courses,schoolId);
    }

    public BaseVo initCourse(List<Course> courseList ,int schoolId){
        BaseVo baseVo = new BaseVo();
        courseService.deleteSchoolId(schoolId);
        for(Course course : courseList){
            if(course.getCourseId() == 0 || StringUtils.isBlank(course.getCourseName())){
                baseVo.setSuccess(false);
                baseVo.setMessage("缺少参数");
                break;
            }
        }
        if(baseVo.isSuccess()){
            courseService.insertBatch(courseList);
            baseVo.setSuccess(true);
            return baseVo;
        }else {
            return baseVo;
        }
    }

    public BaseVo initClass(List<ClassModel> classList , int schoolId){
        BaseVo baseVo = new BaseVo();
        classModelService.deleteSchool(schoolId);
        for(ClassModel classModel : classList){
            if(classModel.getClassId() == 0 || StringUtils.isBlank(classModel.getClassName()) ||
                    StringUtils.isBlank(classModel.getGrade()) || classModel.getSchoolId() == 0){
                baseVo.setSuccess(false);
                baseVo.setMessage("缺少参数");
                break;
            }
        }
        if(baseVo.isSuccess()){
            classModelService.insertBatch(classList);
            baseVo.setSuccess(true);
            return baseVo;
        }else {
            return baseVo;
        }
    }

    public BaseVo initTeacher(List<Teacher> teacherList , int schoolId){
        List<Teacher> result = new ArrayList<>();
        for(Teacher teacher : teacherList){
            boolean isExist = false;
            for(Teacher t : result){
                if(t.getTeacherName().equals(teacher.getTeacherName())){
                    isExist = true;
                }
            }
            if(!isExist && StringUtils.isNotBlank(teacher.getTeacherName())){
                result.add(teacher);
            }
        }
        BaseVo baseVo = new BaseVo();
        teacherService.deleteSchool(schoolId);
        for(Teacher teacher : result){
            if(teacher.getSchoolId() == 0 || StringUtils.isBlank(teacher.getTeacherName()) ||
                    teacher.getTeacherId() == 0){
                baseVo.setSuccess(false);
                baseVo.setMessage("缺少参数");
                break;
            }
        }
        if(baseVo.isSuccess()){
            teacherService.insertBatch(result);
            baseVo.setSuccess(true);
            return baseVo;
        }else {
            return baseVo;
        }
    }

}