package tech.easyflow.datacenter.connector;

import com.alibaba.fastjson2.JSONObject;
import tech.easyflow.common.entity.LoginAccount;
import tech.easyflow.datacenter.entity.DatacenterTable;
import tech.easyflow.datacenter.meta.entity.DatacenterSource;

import java.math.BigInteger;
import java.util.List;

public interface WriteExecutor {

    void saveRow(DatacenterSource source, DatacenterTable table, JSONObject data, LoginAccount account);

    /**
     * 批量保存数据行。
     * <p>
     * 缺省实现保持逐行语义；支持批处理的连接器应覆盖此方法。
     *
     * @param source 数据源
     * @param table 数据表
     * @param rows 待保存数据行
     * @param account 当前操作账号
     * @param batchSize 单批最大行数
     */
    default void saveRows(DatacenterSource source,
                          DatacenterTable table,
                          List<JSONObject> rows,
                          LoginAccount account,
                          int batchSize) {
        for (JSONObject row : rows) {
            saveRow(source, table, row, account);
        }
    }

    /**
     * 在目标数据库中以唯一回执和业务写入同事务保存数据。
     *
     * <p>缺省实现用于不支持目标库事务回执的连接器，仍保持普通批量写入语义。支持写能力
     * 的连接器应覆盖该方法。</p>
     *
     * @param source 数据源
     * @param table 数据表
     * @param rows 待保存行
     * @param account 操作账号
     * @param batchSize 单批最大行数
     * @param receiptKey 有界幂等回执键
     * @param payloadHash 输入负载摘要
     * @return 本次实际写入时为 {@code true}，同负载回执已存在时为 {@code false}
     */
    default boolean saveRowsIdempotently(
            DatacenterSource source,
            DatacenterTable table,
            List<JSONObject> rows,
            LoginAccount account,
            int batchSize,
            String receiptKey,
            String payloadHash) {
        saveRows(source, table, rows, account, batchSize);
        return true;
    }

    void deleteRow(DatacenterSource source, DatacenterTable table, BigInteger id, LoginAccount account);
}
