package cn.com.warlock.mybatis.plugin.rwseparate;

import org.apache.ibatis.executor.keygen.SelectKeyGenerator;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.Invocation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.com.warlock.mybatis.core.InterceptorHandler;
import cn.com.warlock.mybatis.datasource.DataSourceContextHolder;
import cn.com.warlock.mybatis.plugin.MybatisInterceptor;

/**
 * 读写分离自动路由处理
 */
public class RwRouteHandler implements InterceptorHandler {

    protected static final Logger logger = LoggerFactory.getLogger(RwRouteHandler.class);

    public static final String NAME = "rwRoute";

    @Override
    public Object onInterceptor(Invocation invocation) throws Throwable {

        Object[] objects = invocation.getArgs();
        MappedStatement ms = (MappedStatement) objects[0];
        //已指定强制使用
        if (DataSourceContextHolder.get().isForceUseMaster()) {
            logger.debug("Method[{}] force use Master..", ms.getId());
            return null;
        }

        //读方法
        if (ms.getSqlCommandType().equals(SqlCommandType.SELECT)) {
            //!selectKey 为自增id查询主键(SELECT LAST_INSERT_ID() )方法,使用主库
            if (!ms.getId().contains(SelectKeyGenerator.SELECT_KEY_SUFFIX)) {
                DataSourceContextHolder.get().useSlave(true);
                logger.debug("Method[{} use Slave Strategy..", ms.getId());
            }
        } else {
            logger.debug("Method[{}] use Master Strategy..", ms.getId());
            DataSourceContextHolder.get().useSlave(false);
        }

        return null;
    }

    @Override
    public void onFinished(Invocation invocation, Object result) {
    }

    @Override
    public void start(MybatisInterceptor context) {
    }

    @Override
    public void close() {
    }

    @Override
    public int interceptorOrder() {
        return 1;
    }
}