package com.qxgmat.service.inline;

import com.github.pagehelper.Page;
import com.nuliji.tools.AbstractService;
import com.nuliji.tools.exception.ParameterException;
import com.nuliji.tools.exception.SystemException;
import com.nuliji.tools.mybatis.Example;
import com.qxgmat.data.constants.enums.QuestionSubject;
import com.qxgmat.data.constants.enums.TopicQuality;
import com.qxgmat.data.constants.enums.status.DirectionStatus;
import com.qxgmat.data.dao.TextbookTopicMapper;
import com.qxgmat.data.dao.UserTextbookFeedbackMapper;
import com.qxgmat.data.dao.entity.TextbookTopic;
import com.qxgmat.data.dao.entity.UserTextbookFeedback;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class TextbookTopicService extends AbstractService {
    private static final Logger logger = LoggerFactory.getLogger(TextbookTopicService.class);

    @Resource
    private TextbookTopicMapper textbookTopicMapper;

    public Page<TextbookTopic> listAdmin(int page, int pageSize, String questionType, Number libraryId, String keyword, TopicQuality quality, String order, DirectionStatus direction){
        Example example = new Example(TextbookTopic.class);
        if (questionType!=null){
            example.and(
                    example.createCriteria()
                            .andEqualTo("questionType", questionType)
            );
        }
        if (libraryId!=null){
            example.and(
                    example.createCriteria()
                            .andEqualTo("libraryId", libraryId)
            );
        }
        if (keyword!=null){
            example.and(
                    example.createCriteria()
                            .andLike("keyword", "%"+keyword+"%")
            );
        }
        if (quality!=null){
            example.and(
                    example.createCriteria()
                            .andEqualTo("quality", quality.key)
            );
        }
        if(order == null || order.isEmpty()) order = "id";
        switch(direction){
            case ASC:
                example.orderBy(order).asc();
                break;
            case DESC:
            default:
                example.orderBy(order).desc();
        }
        return select(textbookTopicMapper, example, page, pageSize);
    }
    /**
     * 获取换库表中的最后一题
     * @param libraryId
     * @return
     */
    public TextbookTopic lastByLibrary(Integer libraryId, String questionSubject){
        Example example = new Example(TextbookTopic.class);
        example.and(
                example.createCriteria()
                        .andEqualTo("libraryId", libraryId)
                        .andEqualTo("questionSubject", questionSubject)
        );
        example.orderBy("no").desc();
        return one(textbookTopicMapper, example);
    }

    public Page<TextbookTopic> list(int page, int size, Integer libraryId, QuestionSubject subject, String[] qualitys, Boolean isOld, String order, DirectionStatus direction){
        Example example = new Example(TextbookTopic.class);
        example.and(
                example.createCriteria()
                .andEqualTo("libraryId", libraryId)
                .andEqualTo("questionSubject", subject.key)
        );
        if (qualitys != null){
            example.and(
                    example.createCriteria()
                    .andIn("quality", Arrays.stream(qualitys).collect(Collectors.toList()))
            );
        }
        if (isOld != null){
            example.and(
                    example.createCriteria()
                    .andEqualTo("isOld", isOld ? 1 : 0)
            );
        }
        if(order==null||order.isEmpty()) order = "id";
        if (direction != null){
            switch(direction){
                case ASC:
                    example.orderBy(order).asc();
                    break;
                case DESC:
                default:
                    example.orderBy(order).desc();
            }
        } else {
            example.orderBy(order).desc();
        }
        return select(textbookTopicMapper, example, page, size);
    }

    public TextbookTopic getByNo(Integer libraryId, String subject, Integer no){
        Example example = new Example(TextbookTopic.class);
        example.and(
                example.createCriteria()
                        .andEqualTo("libraryId", libraryId)
                        .andEqualTo("questionSubject", subject)
                        .andEqualTo("no", no)
        );
        return one(textbookTopicMapper, example);
    }


    public TextbookTopic add(TextbookTopic ad){
        int result = insert(textbookTopicMapper, ad);
        ad = one(textbookTopicMapper, ad.getId());
        if(ad == null){
            throw new SystemException("记录添加失败");
        }
        return ad;
    }

    public TextbookTopic edit(TextbookTopic ad){
        TextbookTopic in = one(textbookTopicMapper, ad.getId());
        if(in == null){
            throw new ParameterException("记录不存在");
        }
        int result = update(textbookTopicMapper, ad);
        return ad;
    }

    public boolean delete(Number id){
        TextbookTopic in = one(textbookTopicMapper, id);
        if(in == null){
            throw new ParameterException("记录不存在");
        }
        int result = delete(textbookTopicMapper, id);
        return result > 0;
    }

    public TextbookTopic get(Number id){
        TextbookTopic in = one(textbookTopicMapper, id);

        if(in == null){
            throw new ParameterException("记录不存在");
        }
        return in;
    }

    public Page<TextbookTopic> select(int page, int pageSize){
        return select(textbookTopicMapper, page, pageSize);
    }

    public Page<TextbookTopic> select(Integer[] ids){
        return page(()->select(textbookTopicMapper, ids), 1, ids.length);
    }

    public List<TextbookTopic> select(Collection ids){
        return select(textbookTopicMapper, ids);
    }

}