package com.hzs.system.base;

import com.hzs.common.core.domain.R;
import com.hzs.common.core.enums.ETransactionKey;
import com.hzs.common.core.enums.EYesNo;
import com.hzs.system.base.dto.TransactionDTO;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 国际化翻译接口
 */
public interface ITransactionServiceApi {

    /**
     * 根据key读取数据库翻译
     *
     * @param fromCountry 来源国家（数据结算国）
     * @param content     翻译内容
     * @param toLocal     返回语言
     * @return
     */
    R<String> readTransactionByDataBase(Integer fromCountry, String content, String toLocal);

    /**
     * 根据key列表读取数据库翻译
     *
     * @param fromCountry 来源国家（数据结算国）
     * @param contentList 翻译内容列表
     * @param toLocal     返回语言
     * @return
     */
    R<Map<String, String>> readTransactionListByDataBase(Integer fromCountry, Set<String> contentList, String toLocal);


    /**
     * 根据key读取缓存翻译
     *
     * @param key     翻译key（key规则 + 实际数据ID）
     * @param toLocal 返回语言
     * @return
     */
    R<String> readTransactionByCache(String key, String toLocal);

    /**
     * 根据key列表读取缓存翻译
     *
     * @param keySet  翻译key列表（key规则 + 实际数据ID）
     * @param toLocal 返回语言
     * @return
     */
    R<Map<String, String>> readTransactionListByCache(Set<String> keySet, String toLocal);

    /**
     * 根据key前缀列表读取数据库翻译
     *
     * @param keyPrefixSet 翻译key前缀列表（EnumsPrefixConstants中的前缀）
     * @param toLocal
     * @return
     */
    R<Map<Integer, String>> readTransactionListDataBase(Set<String> keyPrefixSet, String toLocal);

    /**
     * 根据pkId列表读取数据库翻译
     *
     * @param pkIdList pkId列表
     * @param toLocal
     * @return
     */
    R<Map<Integer, String>> readTransactionListDataBase(Collection<Integer> pkIdList, String toLocal);


    /**
     * 数据库+缓存同时查询
     *
     * @param fromCountry 来源国家（数据结算国）
     * @param contentList 翻译内容列表
     * @param keyList     翻译key（key规则 + 实际数据ID）
     * @return
     */
    R<Map<String, String>> readTransactionAll(Integer fromCountry, Set<String> contentList, Set<String> keyList, String toLocal);


    /**
     * 创建国际化翻译（只写入缓存）
     *
     * @param pkCountry 结算国
     * @param key       翻译key规则
     * @param content   翻译内容
     * @return
     */
    R<Integer> createTransactionCacheOnly(Integer pkCountry, ETransactionKey key, String content);

    /**
     * 创建国际化翻译（写入缓存，上传OSS）
     *
     * @param pkCountry 结算国
     * @param key       翻译key规则
     * @param content   翻译内容
     * @return
     */
    R<Integer> createTransaction(Integer pkCountry, ETransactionKey key, String content);

    /**
     * 创建国际化翻译
     *
     * @param pkCountry  结算国
     * @param key        翻译key规则
     * @param content    翻译内容
     * @param cacheFlag  是否写入缓存（传入null为写入缓存处理）
     * @param uploadFlag 是否上传OSS（传入null为上传OSS处理）
     * @return
     */
    R<Integer> createTransaction(Integer pkCountry, ETransactionKey key, String content, EYesNo cacheFlag, EYesNo uploadFlag);


    /**
     * 移除国际化翻译（根据ID）
     *
     * @param pkIdList 翻译ID列表
     * @return
     */
    R<Boolean> removeTransactionByPkId(List<Long> pkIdList);

    /**
     * 移除国际化翻译（根据KEY）
     *
     * @param keyList 翻译key列表
     * @return
     */
    R<Boolean> removeTransactionByKey(List<String> keyList);


    /**
     * 更新国际化翻译
     *
     * @param pkCountry   结算国
     * @param content     翻译内容
     * @param pkId        翻译ID
     * @param updateOther 是否更新其它语种
     * @return
     */
    R<Boolean> updateTransaction(Integer pkCountry, String content, Integer pkId, Boolean updateOther);


    /**
     * 更新国际化翻译（异步翻译回调更新）
     *
     * @param transactionDTO 更新实体
     * @return
     */
    R<Boolean> updateTransactionSync(TransactionDTO transactionDTO);

}
