package com.persagy.proxy.migration.service;

import com.fasterxml.jackson.databind.node.ObjectNode;
import com.persagy.dmp.basic.model.QueryCriteria;
import com.persagy.dmp.rwd.migrate.entity.SyncData;
import com.persagy.proxy.common.entity.InstanceUrlParam;
import com.persagy.proxy.migration.model.DataMigrationExcel;
import com.persagy.proxy.migration.model.DataMigrationResponse;
import com.persagy.proxy.migration.model.MigrationInfo;

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

/**
 * @author lvxianyun
 * @title: MigrationAbstractService
 * @projectName adm-middleware
 * @description: 提供基础的数据操作方法
 * @date 2021/12/3 10:42
 */
public interface MigrationAbstractService<T> {

    /**
     * adm交付数据（A） ∩ 现场数据(B)
     * （A∩B） A
     *  需要进一步对比的数据
     */
    Map<String,Object> doIntersectionGetFrom(Map<String,Object> from, Map<String,Object> to);

    /**
     * adm交付数据（A） ∩ 现场数据(B)
     * （A∩B） B
     *  需要进一步对比的数据
     */
    Map<String,Object> doIntersectionGetTo(Map<String,Object> from, Map<String,Object> to);

    /**
     * adm交付数据(A) 与 现场数据(B) 差集  返回adm数据
     * （A-B）
     * 新增
     */
    Map<String,Object> doSubtractAdd(Map<String,Object> from, Map<String,Object> to);

    /**
     * 现场数据(B) 与 adm交付数据(A) 差集  现场数据
     * （B-A）
     * 删除
     */
    Map<String,Object> doSubtractDel(Map<String,Object> from, Map<String,Object> to);

    /**
     *
     * @param sets
     * @param map
     * @return
     */
    Map<String, Object> getValueForMapByKeys(Set<String> sets, Map<String, Object> map);
    /**
     * 拼接公共链接
     * @param context
     * @param urlStart
     * @return
     */
    String commonUrl(InstanceUrlParam context, String urlStart, MigrationInfo migrationInfo);
    /**
     * 向项目侧提交迁移数据
     * @param url
     * @param requestBody
     */
    String commitDataByHttp(String url, String requestBody);

    /**
     * 向项目侧查询数据数量
     * @param url
     * @param queryCriteria
     */
    Long queryCountByHttp(String url , QueryCriteria queryCriteria);


    /**
     * 将list根据自定义规则转为map  id为key的第一个串
     * 使用 MigrationConstant.spliter 作为拼接符
     * @param list
     * @return
     */
    Map<String,Object> toEntityMap(List<ObjectNode> list, Class<T> clazz);
    /**
     * 获取项目现场交付的数据，默认全部
     * @return
     */
    List<T> getProjectData(QueryCriteria queryCriteria, Class<T> clazz, String url);
    DataMigrationResponse updateBatch(List vos, Class<T> clazz, String url);
    DataMigrationResponse insertBatch(List vos, Class<T> clazz, String url);
    DataMigrationResponse deleteBatch(List<String> ids, Class<T> clazz, String url);

    /**
     * 对比需要更新的数据
     * @param from
     * @param to
     */
    Map<String, Object> compareData(Map<String,Object> from, Map<String,Object> to);

    List<DataMigrationExcel> addErrorInfo(List<String> errorMsg);
    List<SyncData> addErrorInfoForLog(List<String> errorMsg, String tableName);
    List<SyncData> addSynLog(InstanceUrlParam context, List<SyncData> syncDataList);

}
