package com.sdtool.common.api;

import com.sdtool.common.datas.ERPModule;
import com.sdtool.common.entity.base.BaseEntity;
import com.sdtool.common.entity.doc.BusinessScript;
import com.sweetfish.service.RetResult;
import com.sweetfish.service.Service;

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

/**
 * Created by jlutt on 2020-08-19
 *
 * @author jlutt
 */
public interface ScriptService extends Service {

    /**
     * 执行脚本的通用写法
     *
     * @param businessCode 脚本编号
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @param supplier     传入参数的生成函数
     * @param <S>          源参数类型
     * @param <R>          返回对象类型
     * @return 执行结果
     */
    <S extends BaseEntity, R extends BaseEntity> RetResult<R> handleScript(String businessCode,
                                                                           ERPModule erpModule,
                                                                           String dataSourceId,
                                                                           long supplierCode,
                                                                           Supplier<S> supplier);

    /**
     * 执行脚本的通用写法
     *
     * @param businessCode 脚本编号
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @param supplier     传入参数的生成函数
     * @param <S>          源参数类型
     * @param <R>          返回对象类型
     * @return 执行结果
     */
    <S extends BaseEntity, R extends BaseEntity> RetResult<List<R>> handleScriptList(String businessCode,
                                                                                     ERPModule erpModule,
                                                                                     String dataSourceId,
                                                                                     long supplierCode,
                                                                                     Supplier<S> supplier);

    /**
     * 清除脚本缓存
     *
     * @param codeKey 脚本名称
     */
    void invalidateScriptCache(String codeKey);

    /**
     * 重载脚本
     *
     * @param code         脚本名称
     * @param erpModule    ERP模块
     * @param supplierCode 分表
     */
    void reloadScriptCache(String code, ERPModule erpModule, String dataSourceId, long supplierCode);

    /**
     * 获取已加载的业务脚本列表
     *
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @return 脚本列表
     */
    List<BusinessScript> getLoadedScriptCache(String dataSourceId, long supplierCode);

}
