package com.brilliance.isc.common.transaction;

import com.brilliance.isc.bo.Trn;
import com.brilliance.isc.common.contants.CommonContants;
import com.brilliance.isc.common.transaction.vo.BaseTransactionVo;
import org.apache.commons.collections.map.HashedMap;
import org.apache.commons.compress.utils.Lists;

import java.util.List;
import java.util.Map;

public interface TransactionService<T extends BaseTransactionVo> {

    /**
     * 交易初始化
     */
    default T init(T transactionVo) {
        return transactionVo;
    }

    /**
     * 交易初始经办柜员
     */
    default T initUsrcon(T transactionVo) {
        return transactionVo;
    }

    Map<String, String> check(T transactionVo);

    boolean warning(T transactionVo);

    /**
     * 错误提示校验
     */
    default List<Map<String, Object>> txnErrCheck(T transactionVo) {
        return Lists.newArrayList();
    }

    /**
     * 存盘校验
     */
    default T checkAll(T transactionVo) {
        this.beforeSave(transactionVo);
        Map<String, Object> maps = new HashedMap();
        maps.put(CommonContants.CHECK_RULE_KEY, this.check(transactionVo));
        List<Map<String, Object>> errormaps = this.txnErrCheck(transactionVo);
        maps.put(CommonContants.CHECK_ERROR_KEY, errormaps);
        boolean warningChange = this.warning(transactionVo);
        if (!warningChange) {
            maps.put(CommonContants.CHECK_WARNING_CHANGE, "Y");
        }
        this.afterSave(transactionVo,false);
        transactionVo.setErrorMap(maps);
        return transactionVo;
    }

    /**
     * 交易暂存
     */
    T txnHold(T transactionVo);

    /**
     * 动态获取码表值
     */
    // Map<String, List<DicCode>> getDiffCodeTable(Map<String, Object> params, List<DicCode> list);


    /**
     * 存盘处理
     */
    default T saveTransaction(T transactionVo) {
        this.beforeSave(transactionVo);
        this.save(transactionVo);
        this.afterSave(transactionVo,true);
        return transactionVo;
    }

    /**
     * 存盘处理
     */
    default T saveTransactionForAuto(T transactionVo) {
        this.beforeSave(transactionVo);
        this.save(transactionVo);
        this.afterSave(transactionVo,true);
        return transactionVo;
    }

    void beforeSave(T transactionVo);

    boolean save(T transactionVo);

    default void afterSave(T transactionVo,boolean shouldReleaseLock) {

    }

    default boolean exit(T transactionVo) {
        return true;
    }

    /**
     * 交易退回接口
     */
    default void repairTxnData(Trn trn) {

    }

    default String convertText(String template, Map<String, String> fieldMap, T bo) {
        return template;
    }

//    default String convertTextExceType(String template, Map<String, String> fieldMap, T bo) {
//        return template;
//    }

    /**
     * 其他功能检核 例如统一名单
     * @param transactionVo
     * @return
     */
    boolean otherCheck(T transactionVo);

    /**
     *发生变化时，返回 true
     * @param transactionVo
     * @return
     */
    default boolean checkReload(T transactionVo){
        return false;
    }
}
