package com.zd.exam.service.impl;

import com.zd.exam.domain.ElQuRepo;
import com.zd.exam.mapper.ElQuRepoMapper;
import com.zd.exam.service.ElQuRepoService;
import com.zd.exam.service.ElRepoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;

/**
 * 试题题库(ElQuRepo)表服务实现类
 *
 * @author liubo
 * @since 2021-08-30 17:10:49
 */
@Service("elQuRepoService")
public class ElQuRepoServiceImpl implements ElQuRepoService {
    @Resource
    private ElQuRepoMapper elQuRepoMapper;
    @Autowired
    private ElRepoService elRepoService;

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public ElQuRepo queryById(Long id) {
        return this.elQuRepoMapper.queryById(id);
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    @Override
    public List<ElQuRepo> queryAllByLimit(int offset, int limit) {
        return this.elQuRepoMapper.queryAllByLimit(offset, limit);
    }

    /**
     * 新增数据
     *
     * @param elQuRepo 实例对象
     * @return 实例对象
     */
    @Override
    public ElQuRepo insert(ElQuRepo elQuRepo) {
        this.elQuRepoMapper.insert(elQuRepo);
        return elQuRepo;
    }

    /**
     * 修改数据
     *
     * @param elQuRepo 实例对象
     * @return 实例对象
     */
    @Override
    public ElQuRepo update(ElQuRepo elQuRepo) {
        this.elQuRepoMapper.update(elQuRepo);
        return this.queryById(elQuRepo.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Long id) {
        return this.elQuRepoMapper.deleteById(id) > 0;
    }

    @Override
    public List<Long> queryByQuId(Long quId) {
        ElQuRepo elQuRepo = new ElQuRepo();
        elQuRepo.setQuId(quId);
        List<ElQuRepo> elQuRepos = elQuRepoMapper.queryAll(elQuRepo);

        List<Long> ids = new ArrayList<>();
        if (!CollectionUtils.isEmpty(elQuRepos)) {
            for (ElQuRepo item : elQuRepos) {
                ids.add(item.getRepoId());
            }
        }
        return ids;
    }

    @Override
    public void saveAll(@NotNull Long quId, Integer quType, List<Long> repoIds) {

        // 先删除
        elQuRepoMapper.deleteByQuId(quId);

        // 保存全部
        if (!CollectionUtils.isEmpty(repoIds)) {
            List<ElQuRepo> list = new ArrayList<>();
            for (Long id : repoIds) {
                ElQuRepo ref = new ElQuRepo();
                ref.setQuId(quId);
                ref.setRepoId(id);
                ref.setQuType(quType);
                list.add(ref);
            }
            elQuRepoMapper.insertBatch(list);

            for (Long id : repoIds) {
                this.sortRepo(id);
            }
        }
    }

    /**
     * 单个题库进行排序
     *
     * @param repoId
     */
    private void sortRepo(Long repoId) {

        ElQuRepo elQuRepo = new ElQuRepo();
        elQuRepo.setRepoId(repoId);

        List<ElQuRepo> list = elQuRepoMapper.queryAll(elQuRepo);

        if (CollectionUtils.isEmpty(list)) {
            return;
        }

        int sort = 1;
        for (ElQuRepo item : list) {
            item.setSort(sort);
            sort++;
        }
        elQuRepoMapper.insertOrUpdateBatch(list);

        // 更新统计数量
        elRepoService.refreshStat(repoId);
    }
}
