package com.awspaas.user.apps.bnbm.datalinkup.service;

import com.actionsoft.bpms.bo.engine.BO;
import com.actionsoft.bpms.commons.database.RowMap;
import com.awspaas.user.apps.bnbm.datalinkup.entity.DateRange;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @ClassName: DataSyncService
 * @Description: 数据同步服务接口，定义数据同步的核心操作
 */
public interface DataSyncService {
    /**
     * 根据主配置列表执行数据同步
     * @param configs 主配置列表（BO_EU_BNBM_DATALINKUP_SJGTPZ表记录）
     */
    ArrayList<DateRange> syncDataByConfigs(List<BO> configs);

    /**
     * 处理单个主配置的数据同步
     * @param mainConfig 主配置对象（BO_EU_BNBM_DATALINKUP_SJGTPZ表单条记录）
     */
    DateRange processMainConfig(BO mainConfig);

    /**
     * 获取目标表时间字段名
     * @param fieldMappings 字段映射配置列表
     * @param timeField 源表时间字段名
     * @return 目标表时间字段名，未找到返回null
     */
    String getTargetTimeField(List<BO> fieldMappings, String timeField);

    /**
     * 删除目标表中指定时间范围的数据
     * @param targetTable 目标表名
     * @param targetTimeField 目标表时间字段名
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @throws RuntimeException 删除失败时抛出
     */
    void deleteTargetData(String targetTable, String targetTimeField, Date startDate, Date endDate);

    void deleteAllTargetData(String targetTable);

    /**
     * 高斯数据库专用查询方法（支持分区和分页）
     * @param tableName
     * @param timeField
     * @param startDate
     * @param endDate
     * @param partitionField
     * @param fieldMappings
     * @param targetTable
     */
//    void queryGaussDataWithCondition(String tableName, String timeField, Date startDate, Date endDate, String partitionField, List<BO> fieldMappings, String targetTable);

    /**
     * 跨库查询源表数据
     * @param ccId 跨库连接ID
     * @param tableName 源表名
     * @param timeField 源表时间字段名
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 查询结果数据集
     * @throws RuntimeException 查询失败或参数无效时抛出
     */
    void querySourceData(String ccId, String tableName, String timeField, Date startDate, Date endDate, String partitionField, List<BO> fieldMappings, String targetTable,String jezd);
    /**
     * 跨库查询源表数据-应收
     * @param ccId 跨库连接ID
     * @param tableName 源表名
     * @param timeField 源表时间字段名
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 查询结果数据集
     * @throws RuntimeException 查询失败或参数无效时抛出
     */
    void querySourceDataYS(String ccId, String tableName, String timeField, Date startDate, Date endDate, String partitionField, List<BO> fieldMappings, String targetTable, String jezd);


    /**
     * 各板块数据汇总
     * @param configs
     */
    void sumBkTable(List<BO> configs);

    /**
     * 将范围内数据汇总
     * @param targetTable
     * @param startDate
     * @param endDate
     * @param targetTimeField
     */
    void summarizeScopeData(String targetTable, Date startDate, Date endDate, String targetTimeField, String hzb);

    /**
     * 处理并插入数据到目标表
     * @param sourceData 源数据列表
     * @param mappings 字段映射配置
     * @param targetTable 目标表名
     */
    int processAndInsertData(List<RowMap> sourceData, List<BO> mappings, String targetTable);

    /**
     * 字段映射转换
     * @param source 源数据记录
     * @param mappings 字段映射配置
     * @return 转换后的BO对象
     */
    BO convertFields(RowMap source, List<BO> mappings);

    /**
     * 应收将范围内数据汇总
     * @param targetTable
     * @param startDated
     * @param endDated
     * @param targetTimeField
     */
    void summarizeScopeDataYs(String targetTable, Date startDated, Date endDated, String targetTimeField, String hzb);
}