package com.taobao.tddl.group;

import java.sql.Connection;
import java.sql.Statement;

import javax.sql.DataSource;

import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;

import com.alibaba.druid.pool.DruidDataSource;
import com.taobao.diamond.mockserver.MockServer;
import com.taobao.tddl.atom.common.TAtomConstants;
import com.taobao.tddl.atom.config.TAtomConfParser;
import com.taobao.tddl.atom.config.TAtomDsConfDO;
import com.taobao.tddl.common.model.DBType;
import com.taobao.tddl.group.jdbc.DataSourceWrapper;
import com.taobao.tddl.group.jdbc.TGroupDataSource;
import com.taobao.tddl.group.utils.PropLoadTestUtil;

@Ignore("测试基类")
public class BaseGroupTest {

    protected static final String APPNAME = "tddl_sample";
    protected static final String GROUP0  = "tddl_sample_group_0";
    protected static final String GROUP1  = "tddl_sample_group_1";
    protected static final String GROUP2  = "tddl_sample_group_2";
    protected static final String DSKEY0  = "tddl_sample_0";
    protected static final String DSKEY1  = "tddl_sample_1";
    protected static final String DSKEY2  = "tddl_sample_2";

    @BeforeClass
    public static void beforeClass() {
        MockServer.setUpMockServer();
        // 初始化一些配置
        mockConfig("group0", APPNAME, GROUP0, DSKEY0);
        mockConfig("group1", APPNAME, GROUP1, DSKEY1);
        mockConfig("group2", APPNAME, GROUP2, DSKEY2);
    }

    @AfterClass
    public static void after() {
        MockServer.tearDownMockServer();
    }

    @Before
    public void setUp() throws Exception {
        deleteAll();
    }

    private static void mockConfig(String dir, String appName, String groupName, String dbKey) {
        String globaStr = PropLoadTestUtil.loadPropFile2String("conf/" + dir + "/globa.properties");
        MockServer.setConfigInfo(TAtomConstants.getGlobalDataId(dbKey), globaStr);

        String appStr = PropLoadTestUtil.loadPropFile2String("conf/" + dir + "/app.properties");
        MockServer.setConfigInfo(TAtomConstants.getAppDataId(appName, dbKey), appStr);

        String passwdStr = PropLoadTestUtil.loadPropFile2String("conf/" + dir + "/passwd.properties");
        // 解析配置
        TAtomDsConfDO tAtomDsConfDO = TAtomConfParser.parserTAtomDsConfDO(globaStr, appStr);
        String passwdDataId = TAtomConstants.getPasswdDataId(tAtomDsConfDO.getDbName(),
            tAtomDsConfDO.getDbType(),
            tAtomDsConfDO.getUserName());
        MockServer.setConfigInfo(passwdDataId, passwdStr);
    }

    public static DataSource getMySQLDataSource() {
        return getMySQLDataSource(0);
    }

    public static DataSource getMySQLDataSource(int num) {
        if (num > 2) {
            num = 2;
        }
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUsername("tddl");
        ds.setPassword("tddl");
        ds.setUrl("jdbc:mysql://10.232.31.154/tddl_sample_" + num);
        return ds;

    }

    // 删除三个库中crud表的所有记录
    public static void deleteAll() throws Exception {
        DataSource ds1 = getMySQLDataSource(0);
        DataSource ds2 = getMySQLDataSource(1);
        DataSource ds3 = getMySQLDataSource(2);

        Connection conn = null;
        Statement stmt = null;

        TGroupDataSource ds = new TGroupDataSource();
        DataSourceWrapper dsw = new DataSourceWrapper("tddl_sample_0", "rw", ds1, DBType.MYSQL);
        ds.init(dsw);

        conn = ds.getConnection();
        stmt = conn.createStatement();
        stmt.executeUpdate("delete from tddl_test_0000");
        stmt.close();
        conn.close();

        ds = new TGroupDataSource();
        dsw = new DataSourceWrapper("tddl_sample_1", "rw", ds2, DBType.MYSQL);
        ds.init(dsw);
        conn = ds.getConnection();
        stmt = conn.createStatement();
        stmt.executeUpdate("delete from tddl_test_0000");
        stmt.close();
        conn.close();

        ds = new TGroupDataSource();
        dsw = new DataSourceWrapper("tddl_sample_2", "rw", ds3, DBType.MYSQL);
        ds.init(dsw);
        conn = ds.getConnection();
        stmt = conn.createStatement();
        stmt.executeUpdate("delete from tddl_test_0000");
        stmt.close();
        conn.close();
    }
}