package com.sdtool.common.api;


import com.sdtool.common.datas.ERPModule;
import com.sdtool.common.entity.base.BaseEntity;
import com.sdtool.common.entity.site.ERPTokenUser;
import com.dySweetFishPlugin.sql.dao.OperatorWait;
import com.sweetfish.service.RetResult;

import java.util.List;

/**
 * Created by jlutt on 2018-10-23.
 * 业务执行接口
 * 通过groovy脚本实现
 *
 * @author jlutt
 */
public interface BusinessExecutor<S extends BaseEntity, R extends BaseEntity> {

    default String scriptName() {
        return "未知名称脚本";
    }

    default ERPModule module() {
        return ERPModule.NONE;
    }

    default String getPerms(ERPTokenUser currentUser) {
        return "";
    }

    default OperatorWait getAWait(S source) {
        return OperatorWait.SYNC;
    }

    /**
     * 脚本模块第一次载入需要执行的代码
     * 例如初始化信息，
     */
    default void start(long supplierCode) {
    }

    default void destroy(long supplierCode) {
    }

    default boolean checkIn(S source) {
        return true;
    }

    default boolean needLogin(S source) {
        return false;
    }

    /**
     * 是否需要检查formToken，防止重复点击
     * 放在Rest的call中判断，不太方便，因为有些脚本也不需要检查
     *
     * @param source 输入参数
     * @return 是否需要检查token
     */
    default boolean needToken(S source) {
        return false;
    }

    //数据检查
    default RetResult<S> checkExecute(S source) {
        //默认方法转一到手，不允许直接返回成功，因为有可能对source做了处理
        return RetResult.<S>successT().result(source);
    }

    default RetResult<S> beforeExecute(S source) {
        //默认方法转一到手，不允许直接返回成功，因为有可能对source做了处理
        return RetResult.<S>successT().result(source);
    }

    default RetResult<R> execute(S source) {
        return null;
    }

    /**
     * 执行完成后需要收尾的工作
     * 为什么要判断executeError，因为有时候在执行数据之前，临时为了让订单之类的数据客户端查不到，会修改一下es里面的状态值，如果出错后需要修改回去，如果不出错则需要发送打印之类的信息
     *
     * @param executeError execute是否出错 true表示出错，false表示没出错
     * @param source       传入参数
     * @param dest         execute的返回值
     */
    default void afterExecute(boolean executeError, S source, RetResult<R> dest) {

    }

    default RetResult<List<R>> executeList(S source) {
        return null;
    }
}
