package com.seer.teach.admin.convert;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.seer.teach.admin.request.BankQuestionsBatchSaveReq;
import com.seer.teach.admin.request.BankQuestionsQueryReq;
import com.seer.teach.admin.request.BankQuestionsReq;
import com.seer.teach.admin.request.GenerateTaskReq;
import com.seer.teach.admin.response.BankQuestionsResp;
import com.seer.teach.teacher.module.entity.BankQuestionsEntity;
import com.seer.teach.teacher.module.param.KnowledgePointSearchParam;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

import java.util.List;

/**
 * <p>
 * 题库转换器
 * </p>
 *
 * @author Lingma
 * @since 2025-10-27
 */
@Mapper
public interface BankQuestionsConvert {

    BankQuestionsConvert INSTANCE = Mappers.getMapper(BankQuestionsConvert.class);

    /**
     * 将题库实体转换为响应参数
     *
     * @param entity 题库实体
     * @return 题库响应参数
     */
    BankQuestionsResp toResp(BankQuestionsEntity entity);

    /**
     * 将题库请求参数转换为实体
     *
     * @param req 题库请求参数
     * @return 题库实体
     */
    BankQuestionsEntity toEntity(BankQuestionsReq req);

    /**
     * 将题库实体列表转换为响应参数列表
     *
     * @param entities 题库实体列表
     * @return 题库响应参数列表
     */
    List<BankQuestionsResp> toRespList(List<BankQuestionsEntity> entities);

    /**
     * 将题库响应参数列表转换为实体列表
     *
     * @param resps 题库响应参数列表
     * @return 题库实体列表
     */
    List<BankQuestionsEntity> toEntityList(List<BankQuestionsResp> resps);

    /**
     * 将题库实体分页转换为响应参数分页
     *
     * @param entityPage 题库实体分页
     * @return 题库响应参数分页
     */
    default Page<BankQuestionsResp> toRespPage(IPage<BankQuestionsEntity> entityPage) {
        Page<BankQuestionsResp> respPage = new Page<>();
        respPage.setRecords(toRespList(entityPage.getRecords()));
        respPage.setCurrent(entityPage.getCurrent());
        respPage.setSize(entityPage.getSize());
        respPage.setTotal(entityPage.getTotal());
        respPage.setPages(entityPage.getPages());
        return respPage;
    }

    /**
     * 将题库请求参数列表转换为实体列表
     *
     * @param questions 题库请求参数列表
     * @return 题库实体列表
     */
    List<BankQuestionsEntity> req2EntityList(List<BankQuestionsBatchSaveReq.BankQuestionItem> questions);

    /**
     * 将题库请求参数转换为知识点搜索参数
     *
     * @param req 题库请求参数
     * @return 知识点搜索参数
     */
    KnowledgePointSearchParam req2KnowledgePointSearchParam(BankQuestionsQueryReq req);

    /**
     * 将题库请求参数转换为知识点搜索参数
     *
     * @param req 题库请求参数
     * @return 知识点搜索参数
     */
    KnowledgePointSearchParam generateBankQuestionReq2KnowledgePointSearchParam(GenerateTaskReq req);
}