package com.github.yizzuide.milkomeda.sundial;

import com.github.yizzuide.milkomeda.util.ReflectUtil;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;

import java.lang.reflect.Field;

/**
 * SundialTweakConfig
 *
 * @author yizzuide
 * @since 3.7.1
 * Create at 2020/05/31 14:57
 */
@ConditionalOnClass(MybatisAutoConfiguration.class)
@AutoConfigureAfter(MybatisAutoConfiguration.class)
public class SundialTweakConfig {
    @Autowired
    public void configSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
        MultiDataSourceTransactionFactory multiDataSourceTransactionFactory = new MultiDataSourceTransactionFactory();
        Pair<Field, Object> envFieldBundle = ReflectUtil.getFieldBundlePath(sqlSessionFactory, "configuration.environment");
        Environment originEnvironment = (Environment) envFieldBundle.getValue();
        Environment environment = new Environment(originEnvironment.getId(), multiDataSourceTransactionFactory, originEnvironment.getDataSource());
        Pair<Field, Object> confFieldBundle = ReflectUtil.getFieldBundlePath(sqlSessionFactory, "configuration");
        Object configuration = confFieldBundle.getValue();
        ReflectUtil.invokeMethod(configuration, "setEnvironment", new Class[]{Environment.class}, environment);
    }
}