package com.qxgmat.controller.api;

import com.github.pagehelper.Page;
import com.nuliji.tools.*;
import com.nuliji.tools.exception.AuthException;
import com.nuliji.tools.exception.ParameterException;
import com.qxgmat.data.constants.enums.QuestionSubject;
import com.qxgmat.data.constants.enums.ServiceKey;
import com.qxgmat.data.constants.enums.status.DirectionStatus;
import com.qxgmat.data.dao.entity.*;
import com.qxgmat.dto.extend.UserServiceRecordExtendDto;
import com.qxgmat.dto.response.UserTextbookInfoDto;
import com.qxgmat.help.ShiroHelp;
import com.qxgmat.service.UserServiceService;
import com.qxgmat.service.UsersService;
import com.qxgmat.service.extend.QuestionFlowService;
import com.qxgmat.service.inline.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.List;

@RestController
@RequestMapping("/api/textbook")
@Api(tags = "机经", description = "机经接口")
public class TextbookController
{
    @Autowired
    private ShiroHelp shiroHelp;

    @Autowired
    private QuestionService questionService;

    @Autowired
    private SettingService settingService;

    @Autowired
    private UsersService usersService;

    @Autowired
    private UserServiceService userServiceService;

    @Autowired
    private UserOrderRecordService userOrderRecordService;

    @Autowired
    private QuestionFlowService questionFlowService;

    @Autowired
    private TextbookLibraryService textbookLibraryService;

    @Autowired
    private TextbookLibraryHistoryService textbookLibraryHistoryService;

    @Autowired
    private TextbookTopicService textbookTopicService;


    @RequestMapping(value = "/info", method = RequestMethod.GET)
    @ApiOperation(value = "机经信息", httpMethod = "GET")
    public Response<UserTextbookInfoDto> info(HttpSession session) {
        User user = (User) shiroHelp.getLoginUser();
        UserTextbookInfoDto dto = new UserTextbookInfoDto();

        TextbookLibrary latest = textbookLibraryService.getLatest();
        dto.setLatest(latest);
        if (user != null){
            dto.setHasService(userServiceService.hasService(user.getId(), ServiceKey.TEXTBOOK));
            UserOrderRecord record = userOrderRecordService.getUnUseService(user.getId(), ServiceKey.TEXTBOOK);
            dto.setUnUseRecord(Transform.convert(record, UserServiceRecordExtendDto.class));
        }
        TextbookLibrary second = textbookLibraryService.getSecond();
        dto.setSecond(second);

        return ResponseHelp.success(dto);
    }

    @RequestMapping(value = "/year", method = RequestMethod.GET)
    @ApiOperation(value = "机经年度更新信息", httpMethod = "GET")
    public Response<List<TextbookLibrary>> year(
            @RequestParam(required = false) String year,
            HttpSession session) {
        Date start;
        try {
            start = DateFormat.getDateInstance().parse(String.format("%s-01-01", year));
        } catch (ParseException e) {
            throw new ParameterException("日期格式错误");
        }
        Date end = Tools.addYear(start, 1);
        List<TextbookLibrary> libraryList = textbookLibraryService.listByTime(start, end);

        return ResponseHelp.success(libraryList);
    }

    @RequestMapping(value = "/history/all", method = RequestMethod.GET)
    @ApiOperation(value = "机经更新记录", httpMethod = "GET")
    public Response<List<TextbookLibraryHistory>> listHistory(
            @RequestParam(required = true) String subject,
            HttpSession session) {
        User user = (User) shiroHelp.getLoginUser();
        if (user == null){
            throw new AuthException("请先登录");
        }
        if (!userServiceService.hasService(user.getId(), ServiceKey.TEXTBOOK)){
            throw new ParameterException("没有机经查看权限");
        }
        if (QuestionSubject.ValueOf(subject) == null){
            throw new ParameterException("科目错误");
        }
        TextbookLibrary library = textbookLibraryService.getLatest();
        List<TextbookLibraryHistory> p = textbookLibraryHistoryService.allByLibraryAndSubject(library.getId(), QuestionSubject.ValueOf(subject));

        return ResponseHelp.success(p);
    }

    @RequestMapping(value = "/topic/list", method = RequestMethod.GET)
    @ApiOperation(value = "机经列表", httpMethod = "GET")
    public Response<PageMessage<TextbookTopic>> listTopic(
            @RequestParam(required = false, defaultValue = "1") int page,
            @RequestParam(required = false, defaultValue = "100") int size,
            @RequestParam(required = true) boolean latest,
            @RequestParam(required = true) String subject,
            @RequestParam(required = false) String[] qualitys,
            @RequestParam(required = false) Boolean isOld,
            @RequestParam(required = false, defaultValue = "id") String order,
            @RequestParam(required = false, defaultValue = "desc") String direction,
            HttpSession session) {
        TextbookLibrary library;
        if (latest){
            User user = (User) shiroHelp.getLoginUser();
            if (user == null){
                throw new AuthException("请先登录");
            }
            if (!userServiceService.hasService(user.getId(), ServiceKey.TEXTBOOK)){
                throw new ParameterException("没有机经查看权限");
            }
            library = textbookLibraryService.getLatest();
        }else{
            // 获取往期:倒数第二
            library = textbookLibraryService.getSecond();
        }

        Page<TextbookTopic> p = textbookTopicService.list(page, size, library.getId(), QuestionSubject.ValueOf(subject), qualitys, isOld, order, DirectionStatus.ValueOf(direction));

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