package com.hotent.common;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hotent.base.model.CommonResult;
import com.hotent.req.PageReq;
import com.hotent.resp.PageResp;

import java.util.List;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * 通用分页查询服务类
 * 通过组合模式实现，避免使用抽象类
 */
public class PageQueryService {
    
    /**
     * 通用分页查询方法
     * @param req 分页请求参数
     * @param queryFunction 分页查询函数
     * @param <T> 实体类型
     * @param <R> 请求参数类型
     * @return 分页结果
     */
    public <T, R extends PageReq> PageResp<T> pageQuery(R req, Function<R, IPage<T>> queryFunction) {
        try {
            IPage<T> result = queryFunction.apply(req);
            return PageResp.success(result);
        } catch (Exception e) {
            return PageResp.error(e.getMessage());

        }
    }
    
    /**
     * 通用列表查询方法
     * @param listSupplier 列表查询供应函数
     * @param <T> 实体类型
     * @return 列表结果
     */
    public <T> CommonResult<List<T>> listQuery(Supplier<List<T>> listSupplier) {
        try {
            List<T> result = listSupplier.get();
            return CommonResult.<List<T>>ok().value(result);
        } catch (Exception e) {
            return CommonResult.<List<T>>error().message(e.getMessage());
        }
    }
    
    /**
     * 通用详情查询方法
     * @param id 主键
     * @param detailFunction 详情查询函数
     * @param <T> 实体类型
     * @return 详情结果
     */
    public <T> CommonResult<T> detailQuery(String id, Function<String, T> detailFunction) {
        try {
            T result = detailFunction.apply(id);
            return CommonResult.<T>ok().value(result);
        } catch (Exception e) {
            return CommonResult.<T>error().message(e.getMessage());
        }
    }
}
