package com.qxgmat.controller.admin;

import com.github.pagehelper.Page;
import com.nuliji.tools.PageMessage;
import com.nuliji.tools.Response;
import com.nuliji.tools.ResponseHelp;
import com.nuliji.tools.Transform;
import com.qxgmat.data.constants.enums.module.CourseModule;
import com.qxgmat.data.constants.enums.module.ProductType;
import com.qxgmat.data.constants.enums.status.AskStatus;
import com.qxgmat.data.constants.enums.status.DirectionStatus;
import com.qxgmat.data.constants.enums.user.DataType;
import com.qxgmat.data.constants.enums.user.MoneyRange;
import com.qxgmat.data.dao.entity.*;
import com.qxgmat.data.relation.entity.CourseStudentNumberRelation;
import com.qxgmat.dto.admin.extend.*;
import com.qxgmat.dto.admin.request.*;
import com.qxgmat.dto.admin.response.*;
import com.qxgmat.help.ShiroHelp;
import com.qxgmat.service.ManagerService;
import com.qxgmat.service.UsersService;
import com.qxgmat.service.extend.CourseExtendService;
import com.qxgmat.service.inline.*;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.xml.transform.TransformerFactory;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;

@RestController("AdminClassController")
@RequestMapping("/admin/course")
public class CourseController {
    @Autowired
    private ShiroHelp shiroHelp;

    @Autowired
    private CourseService courseService;

    @Autowired
    private CourseNoService courseNoService;

    @Autowired
    private CoursePackageService coursePackageService;

    @Autowired
    private CourseDataService courseDataService;

    @Autowired
    private CourseDataHistoryService courseDataHistoryService;

    @Autowired
    private CourseExperienceService courseExperienceService;

    @Autowired
    private CourseTeacherService courseTeacherService;

    @Autowired
    private CourseTimeService courseTimeService;

    @Autowired
    private CourseStudentOnlineService courseStudentOnlineService;

    @Autowired
    private UserAskCourseService userAskCourseService;

    @Autowired
    private ManagerLogService managerLogService;

    @Autowired
    private ManagerService managerService;

    @Autowired
    private UsersService usersService;

    @Autowired
    private UserOrderRecordService userOrderRecordService;

    @Autowired
    private CourseExtendService courseExtendService;


    @RequestMapping(value = "/add", method = RequestMethod.POST)
    @ApiOperation(value = "添加课程", httpMethod = "POST")
    public Response<Course> add(@RequestBody @Validated Course dto, HttpServletRequest request) {
        Course entity = Transform.convert(dto, Course.class);
        entity = courseService.add(entity);
        managerLogService.log(request);
        return ResponseHelp.success(Transform.convert(entity, Course.class));
    }

    @RequestMapping(value = "/edit", method = RequestMethod.PUT)
    @ApiOperation(value = "编辑课程", httpMethod = "PUT")
    public Response<Boolean> edit(@RequestBody @Validated Course dto, HttpServletRequest request) {
        Course entity = Transform.convert(dto, Course.class);
        entity = courseService.edit(entity);
        managerLogService.log(request);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/delete", method = RequestMethod.DELETE)
    @ApiOperation(value = "删除课程", httpMethod = "DELETE")
    public Response<Boolean> delete(@RequestParam int id, HttpServletRequest request) {
        Course entity = courseService.get(id);
        courseService.delete(id);
        managerLogService.log(request);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/detail", method = RequestMethod.GET)
    @ApiOperation(value = "获取课程", httpMethod = "GET")
    public Response<Course> detail(@RequestParam int id,HttpSession session) {
        Course entity = courseService.get(id);
        return ResponseHelp.success(Transform.convert(entity, Course.class));
    }

    @RequestMapping(value = "/list", method = RequestMethod.GET)
    @ApiOperation(value = "课程列表", httpMethod = "GET")
    public Response<PageMessage<CourseListDto>> list(
            @RequestParam(required = false, defaultValue = "1") int page,
            @RequestParam(required = false, defaultValue = "100") int size,
            @RequestParam(required = false) Integer[] ids,
            @RequestParam(required = false) String keyword,
            @RequestParam(required = false) String courseModule,
            @RequestParam(required = false) Integer structId,
            @RequestParam(required = false) Boolean excludeVs,
            HttpSession session) {
        Page<Course> p;
        if (ids != null && ids.length > 0){
            p = courseService.select(ids);
        }else{
            p = courseService.listAdmin(page, size, keyword, CourseModule.ValueOf(courseModule), structId, excludeVs);
        }
        List<CourseListDto> pr = Transform.convert(p, CourseListDto.class);

        return ResponseHelp.success(pr, page, size, p.getTotal());
    }

    @RequestMapping(value = "/package/add", method = RequestMethod.POST)
    @ApiOperation(value = "添加套餐", httpMethod = "POST")
    public Response<CoursePackage> addPackage(@RequestBody @Validated CoursePackageDto dto, HttpServletRequest request) {
        CoursePackage entity = Transform.dtoToEntity(dto);
        entity = coursePackageService.add(entity);
        managerLogService.log(request);
        return ResponseHelp.success(Transform.convert(entity, CoursePackage.class));
    }
    @RequestMapping(value = "/package/edit", method = RequestMethod.PUT)
    @ApiOperation(value = "编辑套餐", httpMethod = "PUT")
    public Response<Boolean> editPackage(@RequestBody @Validated CoursePackageDto dto, HttpServletRequest request) {
        CoursePackage entity = Transform.dtoToEntity(dto);
        entity = coursePackageService.edit(entity);
        managerLogService.log(request);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/package/delete", method = RequestMethod.DELETE)
    @ApiOperation(value = "删除套餐", httpMethod = "DELETE")
    public Response<Boolean> deletePackage(@RequestParam int id, HttpServletRequest request) {
        coursePackageService.delete(id);
        managerLogService.log(request);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/package/detail", method = RequestMethod.GET)
    @ApiOperation(value = "获取套餐", httpMethod = "GET")
    public Response<CoursePackage> detailPackage(@RequestParam int id,HttpSession session) {
        CoursePackage entity = coursePackageService.get(id);
        return ResponseHelp.success(Transform.convert(entity, CoursePackage.class));
    }
    @RequestMapping(value = "/package/list", method = RequestMethod.GET)
    @ApiOperation(value = "套餐列表", httpMethod = "GET")
    public Response<PageMessage<CoursePackage>> listPackage(
            @RequestParam(required = false, defaultValue = "1") int page,
            @RequestParam(required = false, defaultValue = "100") int size,
            HttpSession session) {
        Page<CoursePackage> p = coursePackageService.select(page, size);
        List<CoursePackage> pr = Transform.convert(p, CoursePackage.class);
        return ResponseHelp.success(pr, page, size, p.getTotal());
    }

    @RequestMapping(value = "/data/add", method = RequestMethod.POST)
    @ApiOperation(value = "添加资料", httpMethod = "POST")
    public Response<CourseData> addData(@RequestBody @Validated CourseDataDto dto, HttpServletRequest request) {
        CourseData entity = Transform.dtoToEntity(dto);
        entity = courseDataService.add(entity);
        managerLogService.log(request);
        return ResponseHelp.success(Transform.convert(entity, CourseData.class));
    }

    @RequestMapping(value = "/data/edit", method = RequestMethod.PUT)
    @ApiOperation(value = "编辑资料", httpMethod = "PUT")
    public Response<Boolean> editData(@RequestBody @Validated CourseDataDto dto, HttpServletRequest request) {
        CourseData entity = Transform.dtoToEntity(dto);
        entity = courseDataService.edit(entity);
        managerLogService.log(request);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/data/delete", method = RequestMethod.DELETE)
    @ApiOperation(value = "删除资料", httpMethod = "DELETE")
    public Response<Boolean> deleteData(@RequestParam int id, HttpServletRequest request) {
        courseDataService.delete(id);
        managerLogService.log(request);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/data/detail", method = RequestMethod.GET)
    @ApiOperation(value = "获取资料", httpMethod = "GET")
    public Response<CourseData> detailData(@RequestParam int id,HttpSession session) {
        CourseData entity = courseDataService.get(id);
        return ResponseHelp.success(Transform.convert(entity, CourseData.class));
    }

    @RequestMapping(value = "/data/list", method = RequestMethod.GET)
    @ApiOperation(value = "资料列表", httpMethod = "GET")
    public Response<PageMessage<CourseData>> listData(
            @RequestParam(required = false, defaultValue = "1") int page,
            @RequestParam(required = false, defaultValue = "100") int size,
            @RequestParam(required = false) Integer structId,
            @RequestParam(required = false) String dataType,
            @RequestParam(required = false, defaultValue = "id") String order,
            @RequestParam(required = false, defaultValue = "desc") String direction,
            HttpSession session) {
        Page<CourseData> p = courseDataService.listAdmin(page, size, structId, DataType.ValueOf(dataType), order, DirectionStatus.ValueOf(direction));
        List<CourseData> pr = Transform.convert(p, CourseData.class);
        return ResponseHelp.success(pr, page, size, p.getTotal());
    }

    @RequestMapping(value = "/data/history/add", method = RequestMethod.POST)
    @ApiOperation(value = "添加资料历史", httpMethod = "POST")
    public Response<CourseDataHistory> addDataHistory(@RequestBody @Validated CourseDataHistoryDto dto, HttpServletRequest request) {
        CourseDataHistory entity = Transform.dtoToEntity(dto);
        entity = courseDataHistoryService.add(entity);
        managerLogService.log(request);
        return ResponseHelp.success(Transform.convert(entity, CourseDataHistory.class));
    }

    @RequestMapping(value = "/data/history/edit", method = RequestMethod.PUT)
    @ApiOperation(value = "编辑资料历史", httpMethod = "PUT")
    public Response<Boolean> editDataHistory(@RequestBody @Validated CourseDataHistoryDto dto, HttpServletRequest request) {
        CourseDataHistory entity = Transform.dtoToEntity(dto);
        entity = courseDataHistoryService.edit(entity);
        managerLogService.log(request);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/data/history/delete", method = RequestMethod.DELETE)
    @ApiOperation(value = "删除资料历史", httpMethod = "DELETE")
    public Response<Boolean> deleteDataHistory(@RequestParam int id, HttpServletRequest request) {
        courseDataHistoryService.delete(id);
        managerLogService.log(request);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/data/history/list", method = RequestMethod.GET)
    @ApiOperation(value = "资料历史列表", httpMethod = "GET")
    public Response<PageMessage<CourseDataHistory>> listDataHistory(
            @RequestParam(required = false, defaultValue = "1") int page,
            @RequestParam(required = false, defaultValue = "100") int size,
            @RequestParam(required = true) Integer dataId,
            HttpSession session) {
        Page<CourseDataHistory> p = courseDataHistoryService.listByData(page, size, dataId);
        List<CourseDataHistory> pr = Transform.convert(p, CourseDataHistory.class);
        return ResponseHelp.success(pr, page, size, p.getTotal());
    }

    @RequestMapping(value = "/experience/add", method = RequestMethod.POST)
    @ApiOperation(value = "添加心经", httpMethod = "POST")
    public Response<CourseExperience> addExperience(@RequestBody @Validated CourseExperienceDto dto, HttpServletRequest request) {
        CourseExperience entity = Transform.dtoToEntity(dto);
        entity = courseExperienceService.add(entity);
        managerLogService.log(request);
        return ResponseHelp.success(Transform.convert(entity, CourseExperience.class));
    }

    @RequestMapping(value = "/experience/edit", method = RequestMethod.PUT)
    @ApiOperation(value = "编辑心经", httpMethod = "PUT")
    public Response<Boolean> editExperience(@RequestBody @Validated CourseDataDto dto, HttpServletRequest request) {
        CourseExperience entity = Transform.dtoToEntity(dto);
        entity = courseExperienceService.edit(entity);
        managerLogService.log(request);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/experience/delete", method = RequestMethod.DELETE)
    @ApiOperation(value = "删除心经", httpMethod = "DELETE")
    public Response<Boolean> deleteExperience(@RequestParam int id, HttpServletRequest request) {
        courseExperienceService.delete(id);
        managerLogService.log(request);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/experience/detail", method = RequestMethod.GET)
    @ApiOperation(value = "获取心经", httpMethod = "GET")
    public Response<CourseExperience> detailExperience(@RequestParam int id,HttpSession session) {
        CourseExperience entity = courseExperienceService.get(id);
        return ResponseHelp.success(Transform.convert(entity, CourseExperience.class));
    }

    @RequestMapping(value = "/experience/list", method = RequestMethod.GET)
    @ApiOperation(value = "心经列表", httpMethod = "GET")
    public Response<PageMessage<CourseExperienceListDto>> listExperience(
            @RequestParam(required = false, defaultValue = "1") int page,
            @RequestParam(required = false, defaultValue = "100") int size,
            @RequestParam(required = false) Integer userId,
            @RequestParam(required = false) String keyword,
            @RequestParam(required = false, defaultValue = "id") String order,
            @RequestParam(required = false, defaultValue = "desc") String direction,
            HttpSession session) {
        Page<CourseExperience> p = courseExperienceService.listAdmin(page, size, userId, keyword, order, DirectionStatus.ValueOf(direction));
        List<CourseExperienceListDto> pr = Transform.convert(p, CourseExperienceListDto.class);

        // 绑定用户
        Collection userIds = Transform.getIds(p, CourseExperience.class, "userId");
        List<User> userList = usersService.select(userIds);
        Transform.combine(pr, userList, CourseExperienceListDto.class, "userId", "user", User.class, "id", UserExtendDto.class);

        return ResponseHelp.success(pr, page, size, p.getTotal());
    }

    @RequestMapping(value = "/teacher/add", method = RequestMethod.POST)
    @ApiOperation(value = "添加老师", httpMethod = "POST")
    public Response<CourseTeacher> addTeacher(@RequestBody @Validated CourseTeacherDto dto, HttpServletRequest request) {
        CourseTeacher entity = Transform.dtoToEntity(dto);
        entity = courseTeacherService.add(entity);
        managerLogService.log(request);
        return ResponseHelp.success(Transform.convert(entity, CourseTeacher.class));
    }

    @RequestMapping(value = "/teacher/edit", method = RequestMethod.PUT)
    @ApiOperation(value = "编辑教师", httpMethod = "PUT")
    public Response<Boolean> editTeacher(@RequestBody @Validated CourseTeacherDto dto, HttpServletRequest request) {
        CourseTeacher entity = Transform.dtoToEntity(dto);
        entity = courseTeacherService.edit(entity);
        managerLogService.log(request);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/teacher/delete", method = RequestMethod.DELETE)
    @ApiOperation(value = "删除教师", httpMethod = "DELETE")
    public Response<Boolean> deleteTeacher(@RequestParam int id, HttpServletRequest request) {
        courseTeacherService.delete(id);
        managerLogService.log(request);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/teacher/detail", method = RequestMethod.GET)
    @ApiOperation(value = "获取教师", httpMethod = "GET")
    public Response<CourseTeacher> detailTeacher(@RequestParam int id,HttpSession session) {
        CourseTeacher entity = courseTeacherService.get(id);
        return ResponseHelp.success(Transform.convert(entity, CourseTeacher.class));
    }

    @RequestMapping(value = "/teacher/list", method = RequestMethod.GET)
    @ApiOperation(value = "教师列表", httpMethod = "GET")
    public Response<PageMessage<CourseTeacher>> listTeacher(
            @RequestParam(required = false, defaultValue = "1") int page,
            @RequestParam(required = false, defaultValue = "100") int size,
            @RequestParam(required = false) Integer courseId,
            HttpSession session) {
        Page<CourseTeacher> p = courseTeacherService.listAdmin(page, size, courseId);
        return ResponseHelp.success(p, page, size, p.getTotal());
    }

    @RequestMapping(value = "/no/add", method = RequestMethod.POST)
    @ApiOperation(value = "添加课时", httpMethod = "POST")
    public Response<CourseNo> addNo(@RequestBody @Validated CourseNoDto dto, HttpServletRequest request) {
        // 查询课时
        CourseNo entity = Transform.dtoToEntity(dto);
        entity = courseNoService.addNo(entity);
        managerLogService.log(request);
        return ResponseHelp.success(Transform.convert(entity, CourseNo.class));
    }

    @RequestMapping(value = "/no/edit", method = RequestMethod.PUT)
    @ApiOperation(value = "编辑课时", httpMethod = "PUT")
    public Response<Boolean> editNo(@RequestBody @Validated CourseNoDto dto, HttpServletRequest request) {
        // 调整课时顺序
        CourseNo entity = Transform.dtoToEntity(dto);
        entity = courseNoService.editNo(entity);
        managerLogService.log(request);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/no/delete", method = RequestMethod.DELETE)
    @ApiOperation(value = "删除课时", httpMethod = "DELETE")
    public Response<Boolean> deleteNo(@RequestParam int id, HttpServletRequest request) {
        // 调整课时顺序
        courseNoService.deleteNo(id);
        managerLogService.log(request);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/no/detail", method = RequestMethod.GET)
    @ApiOperation(value = "获取课时", httpMethod = "GET")
    public Response<CourseNo> detailNo(@RequestParam int id,HttpSession session) {
        CourseNo entity = courseNoService.get(id);
        return ResponseHelp.success(Transform.convert(entity, CourseNo.class));
    }

    @RequestMapping(value = "/no/all", method = RequestMethod.GET)
    @ApiOperation(value = "课时列表", httpMethod = "GET")
    public Response<List<CourseNo>> listNo(
            @RequestParam(required = false) Integer courseId,
            HttpSession session) {
        List<CourseNo> p = courseNoService.allCourse(courseId);
        return ResponseHelp.success(p);
    }

    @RequestMapping(value = "/time/add", method = RequestMethod.POST)
    @ApiOperation(value = "添加课时", httpMethod = "POST")
    public Response<CourseTime> addTime(@RequestBody @Validated CourseTimeDto dto, HttpServletRequest request) {
        CourseTime entity = Transform.dtoToEntity(dto);
        entity = courseTimeService.add(entity);
        managerLogService.log(request);
        return ResponseHelp.success(Transform.convert(entity, CourseTime.class));
    }

    @RequestMapping(value = "/time/edit", method = RequestMethod.PUT)
    @ApiOperation(value = "编辑课时", httpMethod = "PUT")
    public Response<Boolean> editTime(@RequestBody @Validated CourseTimeDto dto, HttpServletRequest request) {
        CourseTime entity = Transform.dtoToEntity(dto);
        entity = courseTimeService.edit(entity);
        managerLogService.log(request);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/time/delete", method = RequestMethod.DELETE)
    @ApiOperation(value = "删除课时", httpMethod = "DELETE")
    public Response<Boolean> deleteTime(@RequestParam int id, HttpServletRequest request) {
        courseTimeService.delete(id);
        managerLogService.log(request);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/time/detail", method = RequestMethod.GET)
    @ApiOperation(value = "获取课时", httpMethod = "GET")
    public Response<CourseTime> detailTime(@RequestParam int id,HttpSession session) {
        CourseTime entity = courseTimeService.get(id);
        return ResponseHelp.success(Transform.convert(entity, CourseTime.class));
    }

    @RequestMapping(value = "/time/list", method = RequestMethod.GET)
    @ApiOperation(value = "课时列表", httpMethod = "GET")
    public Response<PageMessage<CourseTimeInfoDto>> listTime(
            @RequestParam(required = false, defaultValue = "1") int page,
            @RequestParam(required = false, defaultValue = "100") int size,
            @RequestParam(required = false) Integer[] ids,
            @RequestParam(required = false) Integer courseId,
            @RequestParam(required = false) String keyword,
            HttpSession session) {

        Page<CourseTime> p;
        if (ids != null && ids.length > 0){
            p = courseTimeService.select(ids);
        }else{
            p = courseTimeService.listAdmin(page, size, courseId, keyword);
        }
        List<CourseTimeInfoDto> pr = Transform.convert(p, CourseTimeInfoDto.class);

        // 绑定学生数量
        Collection timeIds = Transform.getIds(p, CourseTime.class, "id");
        List<CourseStudentNumberRelation> relations = courseStudentOnlineService.groupByCourse(timeIds);
        Map map = Transform.getMap(relations, CourseStudentNumberRelation.class, "id", "number");
        Transform.combine(pr, map, CourseTimeInfoDto.class, "id", "studentNumber");

        return ResponseHelp.success(pr, page, size, p.getTotal());
    }

    @RequestMapping(value = "/student/online/add", method = RequestMethod.POST)
    @ApiOperation(value = "添加学员", httpMethod = "POST")
    public Response<CourseStudentOnline> addStudentVideo(@RequestBody @Validated CourseStudentOnline entity, HttpServletRequest request) {
//        CourseStudentOnline entity = Transform.dtoToEntity(dto);
        entity = courseStudentOnlineService.addStudent(entity);
        managerLogService.log(request);
        return ResponseHelp.success(Transform.convert(entity, CourseStudentOnline.class));
    }

    @RequestMapping(value = "/student/online/edit", method = RequestMethod.PUT)
    @ApiOperation(value = "编辑学员", httpMethod = "PUT")
    public Response<Boolean> editStudentVideo(@RequestBody @Validated CourseStudentOnline entity, HttpServletRequest request) {
//        CourseStudentOnline entity = Transform.dtoToEntity(dto);
        entity = courseStudentOnlineService.edit(entity);
        managerLogService.log(request);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/student/online/delete", method = RequestMethod.DELETE)
    @ApiOperation(value = "删除学员", httpMethod = "DELETE")
    public Response<Boolean> deleteStudentOnline(@RequestParam int id, HttpServletRequest request) {
        courseTimeService.delete(id);
        managerLogService.log(request);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/student/online/detail", method = RequestMethod.GET)
    @ApiOperation(value = "获取学员", httpMethod = "GET")
    public Response<CourseStudentOnline> detailStudentVideo(@RequestParam int id,HttpSession session) {
        CourseStudentOnline entity = courseStudentOnlineService.get(id);
        return ResponseHelp.success(Transform.convert(entity, CourseStudentOnline.class));
    }

    @RequestMapping(value = "/student/online/list", method = RequestMethod.GET)
    @ApiOperation(value = "课时学员", httpMethod = "GET")
    public Response<PageMessage<CourseStudentOnlineListDto>> listStudentVideo(
            @RequestParam(required = false, defaultValue = "1") int page,
            @RequestParam(required = false, defaultValue = "100") int size,
            @RequestParam(required = false) Integer courseId,
            @RequestParam(required = false) Integer timeId,
            HttpSession session) {
        Page<CourseStudentOnline> p = courseStudentOnlineService.listAdmin(page, size, courseId, timeId);
        List<CourseStudentOnlineListDto> pr = Transform.convert(p, CourseStudentOnlineListDto.class);

        // 绑定用户
        Collection userIds = Transform.getIds(p, CourseStudentOnline.class, "userId");
        List<User> userList = usersService.select(userIds);
        Transform.combine(pr, userList, CourseStudentOnlineListDto.class, "userId", "user", User.class, "id", UserExtendDto.class);

        // 绑定时间段
        Collection timeIds = Transform.getIds(p, CourseStudentOnline.class, "timeId");
        List<CourseTime> timeList = courseTimeService.select(timeIds);
        Transform.combine(pr, timeList, CourseStudentOnlineListDto.class, "timeId", "time", CourseTime.class, "id", CourseTimeExtendDto.class);

        return ResponseHelp.success(pr, page, size, p.getTotal());
    }

    @RequestMapping(value = "/student/vs/add", method = RequestMethod.POST)
    @ApiOperation(value = "添加vs学员", httpMethod = "POST")
    private Response<Boolean> addStudentVs(@RequestBody @Validated UserCourseRecordDto dto){
        UserOrderRecord entity = Transform.dtoToEntity(dto);
        Date startTime = new Date();
        Date endTime = courseExtendService.computeExpire(startTime, dto.getVsNumber(), dto.getCourseId());
        entity.setProductType(ProductType.COURSE.key);
        entity.setOrderId(0);
        entity.setProductId(dto.getCourseId());
        entity.setTeacherId(dto.getTeacherId());
        entity.setSource("offline");
        entity.setIsUsed(1);
        entity.setStartTime(startTime);
        entity.setEndTime(endTime);
        userOrderRecordService.add(entity);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/student/vs/edit", method = RequestMethod.PUT)
    @ApiOperation(value = "修改vs学员", httpMethod = "PUT")
    private Response<Boolean> editStudentVs(@RequestBody @Validated UserCourseRecordDto dto){
        UserOrderRecord entity = Transform.dtoToEntity(dto);
        UserOrderRecord in = userOrderRecordService.get(entity.getId());
        Date endTime = courseExtendService.computeExpire(in.getStartTime(), dto.getVsNumber(), dto.getCourseId());
        entity.setEndTime(endTime);
        userOrderRecordService.edit(entity);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/student/vs/delete", method = RequestMethod.DELETE)
    @ApiOperation(value = "删除vs学员", httpMethod = "DELETE")
    private Response<Boolean> deleteStudentVs(@RequestParam int id){
        userOrderRecordService.delete(id);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/student/vs/list", method = RequestMethod.GET)
    @ApiOperation(value = "获取vs学员", httpMethod = "GET")
    private Response<PageMessage<UserCourseStudentRecordInfoDto>> listStudentVs(
            @RequestParam(required = false, defaultValue = "1") int page,
            @RequestParam(required = false, defaultValue = "100") int size,
            @RequestParam(required = false) Integer courseId,
            @RequestParam(required = false) Integer userId
    ){
        Page<UserOrderRecord> p = userOrderRecordService.listWithStudentAdmin(page, size, courseId, userId);
        List<UserCourseStudentRecordInfoDto> pr = Transform.convert(p, UserCourseStudentRecordInfoDto.class);

        // 绑定用户
        Collection userIds = Transform.getIds(p, UserOrderRecord.class, "userId");
        List<User> userList = usersService.select(userIds);
        Transform.combine(pr, userList, UserCourseStudentRecordInfoDto.class, "userId", "user", User.class, "id", UserExtendDto.class);

        // 绑定教师
        Collection teacherIds = Transform.getIds(p, UserOrderRecord.class, "teacherId");
        List<CourseTeacher> teacherList = courseTeacherService.select(teacherIds);
        Transform.combine(pr, teacherList, UserCourseStudentRecordInfoDto.class, "teacherId", "teacher", CourseTeacher.class, "id", CourseTeacherExtendDto.class);

        return ResponseHelp.success(pr, page, size, p.getTotal());
    }

    @RequestMapping(value = "/study/list", method = RequestMethod.GET)
    @ApiOperation(value = "获取学习记录", httpMethod = "GET")
    private Response<PageMessage<UserCourseStudyRecordInfoDto>> listStudy(
            @RequestParam(required = false, defaultValue = "1") int page,
            @RequestParam(required = false, defaultValue = "100") int size,
            @RequestParam(required = false) Integer[] ids,
            @RequestParam(required = false) String courseModule,
            @RequestParam(required = false) Integer structId,
            @RequestParam(required = false) Integer courseId,
            @RequestParam(required = false) Integer userId,
            @RequestParam(required = false) String teacher
    ){
        Page<UserOrderRecord> p;
        if (ids != null && ids.length > 0){
            p = userOrderRecordService.select(ids);
        }else{
            p = userOrderRecordService.listWithStudyAdmin(page, size, CourseModule.ValueOf(courseModule), structId, courseId, userId, teacher);
        }
        List<UserCourseStudyRecordInfoDto> pr = Transform.convert(p, UserCourseStudyRecordInfoDto.class);

        // 绑定用户
        Collection userIds = Transform.getIds(p, UserOrderRecord.class, "userId");
        List<User> userList = usersService.select(userIds);
        Transform.combine(pr, userList, UserCourseStudyRecordInfoDto.class, "userId", "user", User.class, "id", UserExtendDto.class);

        // 绑定课程
        Map courseMap = Transform.getMap(p, UserOrderRecord.class, "id", "productId");
        Transform.combine(pr, courseMap, UserCourseStudyRecordInfoDto.class, "id", "courseId");
        Collection courseIds = Transform.getIds(p, UserOrderRecord.class, "productId");
        List<Course> courseList = courseService.select(courseIds);
        Transform.combine(pr, courseList, UserCourseStudyRecordInfoDto.class, "courseId", "course", Course.class, "id", CourseExtendDto.class);

        // 绑定老师
        Collection teacherIds = Transform.getIds(p, UserOrderRecord.class, "teacherId");
        List<CourseTeacher> teacherList = courseTeacherService.select(teacherIds);
        Map teacherMap = Transform.getMap(teacherList, CourseTeacher.class,"id", "realname");
        Transform.combine(pr, teacherMap, UserCourseStudyRecordInfoDto.class, "teacherId", "teacher");

        return ResponseHelp.success(pr, page, size, p.getTotal());
    }

    @RequestMapping(value = "/ask/edit", method = RequestMethod.PUT)
    @ApiOperation(value = "修改提问信息", httpMethod = "PUT")
    public Response<Boolean> edit(@RequestBody @Validated UserAskCourseDto dto, HttpServletRequest request) {
        UserAskCourse entity = Transform.dtoToEntity(dto);
        UserAskCourse in = userAskCourseService.get(entity.getId());
        // 调整回答
        if(entity.getAnswer() != null && (!entity.getAnswer().isEmpty() || !in.getAnswer().equals(entity.getAnswer()))){
            entity.setAnswerTime(new Date());
            entity.setAnswerStatus(AskStatus.ANSWER.index);
            Manager manager = shiroHelp.getLoginManager();
            entity.setManagerId(manager.getId());
        }
        if (dto.getIgnoreStatus() != null && dto.getIgnoreStatus() > 0){
            entity.setAnswerStatus(AskStatus.IGNORE.index);
        }

        entity = userAskCourseService.edit(entity);

        if (dto.getOther() !=null && dto.getOther().length > 0){
            // 更新回答排序
            userAskCourseService.updateOrder(dto.getOther());
        }

        managerLogService.log(request);
        return ResponseHelp.success(true);
    }

    @RequestMapping(value = "/ask/detail", method = RequestMethod.GET)
    @ApiOperation(value = "提问详情", httpMethod = "GET")
    public Response<UserAskCourseDetailDto> detail(@RequestParam int id, HttpServletRequest request) {
        UserAskCourse entity = userAskCourseService.get(id);
        UserAskCourseDetailDto dto = Transform.convert(entity, UserAskCourseDetailDto.class);

        if (entity.getManagerId() != null && entity.getManagerId() > 0){
            Manager manager = managerService.get(entity.getManagerId());
            if (manager != null)
                dto.setManager(Transform.convert(manager, ManagerExtendDto.class));
        }

        User user = usersService.get(entity.getUserId());
        dto.setUser(Transform.convert(user, UserExtendDto.class));

        Course course = courseService.get(entity.getCourseId());
        dto.setCourse(Transform.convert(course, CourseExtendDto.class));

        CourseNo courseNo = courseNoService.get(entity.getCourseNoId());
        dto.setCourseNo(Transform.convert(courseNo, CourseNoExtendDto.class));

        // 所有回答
        List<UserAskCourse> userAskList = userAskCourseService.listByCoursePosition(entity.getCourseNoId(), entity.getPosition(), true);
        dto.setOthers(Transform.convert(userAskList, UserAskCourseExtendDto.class));
        return ResponseHelp.success(dto);
    }

    @RequestMapping(value = "/ask/list", method = RequestMethod.GET)
    @ApiOperation(value = "提问列表", httpMethod = "GET")
    public Response<PageMessage<UserAskCourseListDto>> list(
            @RequestParam(required = false, defaultValue = "1") int page,
            @RequestParam(required = false, defaultValue = "100") int size,
            @RequestParam(required = false) Integer structId,
            @RequestParam(required = false) Integer courseId,
            @RequestParam(required = false) Integer answerStatus,
            @RequestParam(required = false) Integer showStatus,
            @RequestParam(required = false) Integer userId,
            @RequestParam(required = false) Integer moneyRang,
            @RequestParam(required = false, defaultValue = "id") String order,
            @RequestParam(required = false, defaultValue = "desc") String direction,
            HttpSession session) {
        Page<UserAskCourse> p = userAskCourseService.listWithCourse(page, size, structId, courseId, AskStatus.ValueOf(answerStatus), showStatus, userId, MoneyRange.ValueOf(moneyRang), order, DirectionStatus.ValueOf(direction));
        List<UserAskCourseListDto> pr = Transform.convert(p, UserAskCourseListDto.class);

        // 绑定用户
        Collection userIds = Transform.getIds(p, UserAskQuestion.class, "userId");
        List<User> userList = usersService.select(userIds);
        Transform.combine(pr, userList, UserAskQuestionListDto.class, "userId", "user", User.class, "id", UserExtendDto.class);

        // 绑定管理员
        Collection managerIds = Transform.getIds(p, UserAskQuestion.class, "managerId");
        List<Manager> managerList = managerService.select(managerIds);
        Transform.combine(pr, managerList, UserAskQuestionListDto.class, "managerId", "manager", Manager.class, "id", ManagerExtendDto.class);

        // 绑定课程
        Collection courseIds = Transform.getIds(p, UserAskCourse.class, "courseId");
        List<Course> courseList = courseService.select(courseIds);
        Transform.combine(pr, courseList, UserAskCourseListDto.class, "courseId", "course", Course.class, "id", CourseExtendDto.class);

        // 绑定课时
        Collection courseNoIds = Transform.getIds(p, UserAskCourse.class, "courseNoId");
        List<CourseNo> courseNoList = courseNoService.select(courseNoIds);
        Transform.combine(pr, courseNoList, UserAskCourseListDto.class, "courseNoId", "courseNo", CourseNo.class, "id", CourseNoExtendDto.class);

        return ResponseHelp.success(pr, page, size, p.getTotal());
    }
}