package com.persagy.dmp.rwd.migrate.service.impl;

import cn.hutool.core.util.StrUtil;
import com.persagy.dmp.rwd.migrate.dao.DigitalMigrateMapper;
import com.persagy.dmp.rwd.migrate.service.IDigitalMigrateService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Set;

/**
 * 数字孪生 数据迁移
 * @author Charlie Yu
 * @date 2021-08-04
 */
@Service
@Slf4j
@Transactional(rollbackFor = Exception.class)
public class DigitalMigrateServiceImpl implements IDigitalMigrateService {

    @Resource
    private DigitalMigrateMapper dao;

    @Override
    public void doMigrate(String schema, String groupCode, Set<String> projectIds) {
        // 变小写
        groupCode = groupCode.toLowerCase();
        // 集团数据迁移
        doMigrate(schema, groupCode);
        // 项目数据迁移
        for(String projectId:projectIds) {
            projectId = projectId.toLowerCase();
            doMigrate(schema, groupCode, projectId);
        }
    }

    /**
     * 执行集团级数据迁移
     * @param schema 数据中台库实例
     * @param groupCode 集团编码
     */
    private void doMigrate(String schema, String groupCode) {
        // 迁移
        log.info(StrUtil.format("正在处理{}集团：迁移类型定义数据...", groupCode));
        try {
            dao.migrateDefineType(schema, groupCode);
        } catch (Exception e) {
            log.error(StrUtil.format("正在处理{}集团：迁移类型定义数据失败：{}", groupCode, e.getMessage()));
        }
        log.info(StrUtil.format("正在处理{}集团：迁移信息点定义数据...", groupCode));
        try {
            dao.migrateDefineInfo(schema, groupCode);
        } catch (Exception e) {
            log.error(StrUtil.format("正在处理{}集团：迁移信息点定义数据失败：{}", groupCode, e.getMessage()));
        }
        log.info(StrUtil.format("正在处理{}集团：迁移图定义数据...", groupCode));
        try {
            dao.migrateDefineGraph(schema, groupCode);
        } catch (Exception e) {
            log.error(StrUtil.format("正在处理{}集团：迁移图定义数据失败：{}", groupCode, e.getMessage()));
        }
        log.info(StrUtil.format("正在处理{}集团：迁移边定义数据...", groupCode));
        try {
            dao.migrateDefineRel(schema, groupCode);
        } catch (Exception e) {
            log.error(StrUtil.format("正在处理{}集团：迁移边定义数据失败：{}", groupCode, e.getMessage()));
        }
    }

    /**
     * 执行项目级迁移
     * @param schema 数据中台库实例
     * @param groupCode 集团编码
     * @param projectId 项目ID
     */
    private void doMigrate(String schema, String groupCode, String projectId) {
        // 迁移
        log.info(StrUtil.format("正在处理{}集团{}项目：迁移对象数据...", groupCode, projectId));
        try {
            dao.migrateObject(schema, groupCode, projectId);
        } catch (Exception e) {
            log.error(StrUtil.format("正在处理{}集团{}项目：迁移对象数据失败：{}", groupCode, projectId, e.getMessage()));
        }
        log.info(StrUtil.format("正在处理{}集团{}项目：迁移关系数据...", groupCode, projectId));
        try {
            dao.migrateRelation(schema, groupCode, projectId);
        } catch (Exception e) {
            log.error(StrUtil.format("正在处理{}集团{}项目：迁移关系数据失败：{}", groupCode, projectId, e.getMessage()));
        }
    }

}
