/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.hcatalog.hbase.snapshot;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.net.URI;
import java.util.Map;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hive.cli.CliSessionState;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
import org.apache.hadoop.hive.ql.processors.CommandProcessorResponse;
import org.apache.hadoop.hive.ql.session.SessionState;
import org.apache.hcatalog.cli.HCatDriver;
import org.apache.hcatalog.cli.SemanticAnalysis.HCatSemanticAnalyzer;
import org.apache.hcatalog.hbase.SkeletonHBaseTest;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.Test;


public class TestZNodeSetUp extends SkeletonHBaseTest {

    private static HiveConf hcatConf;
    private static HCatDriver hcatDriver;

    public void Initialize() throws Exception {

        hcatConf = getHiveConf();
        hcatConf.set(ConfVars.SEMANTIC_ANALYZER_HOOK.varname,
            HCatSemanticAnalyzer.class.getName());
        URI fsuri = getFileSystem().getUri();
        Path whPath = new Path(fsuri.getScheme(), fsuri.getAuthority(),
            getTestDir());
        hcatConf.set(HiveConf.ConfVars.HADOOPFS.varname, fsuri.toString());
        hcatConf.set(ConfVars.METASTOREWAREHOUSE.varname, whPath.toString());

        //Add hbase properties

        for (Map.Entry<String, String> el : getHbaseConf()) {
            if (el.getKey().startsWith("hbase.")) {
                hcatConf.set(el.getKey(), el.getValue());
            }
        }
        HBaseConfiguration.merge(hcatConf,
            RevisionManagerConfiguration.create());
        hcatConf.set(RMConstants.ZOOKEEPER_DATADIR, "/rm_base");
        SessionState.start(new CliSessionState(hcatConf));
        hcatDriver = new HCatDriver();

    }

    @Test
    public void testBasicZNodeCreation() throws Exception {

        Initialize();
        int port = getHbaseConf().getInt("hbase.zookeeper.property.clientPort", 2181);
        String servers = getHbaseConf().get("hbase.zookeeper.quorum");
        String[] splits = servers.split(",");
        StringBuffer sb = new StringBuffer();
        for (String split : splits) {
            sb.append(split);
            sb.append(':');
            sb.append(port);
        }

        hcatDriver.run("drop table test_table");
        CommandProcessorResponse response = hcatDriver
            .run("create table test_table(key int, value string) STORED BY " +
                "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'"
                + "TBLPROPERTIES ('hbase.columns.mapping'=':key,cf1:val')");

        assertEquals(0, response.getResponseCode());

        HBaseAdmin hAdmin = new HBaseAdmin(getHbaseConf());
        boolean doesTableExist = hAdmin.tableExists("test_table");
        assertTrue(doesTableExist);


        ZKUtil zkutil = new ZKUtil(sb.toString(), "/rm_base");
        ZooKeeper zk = zkutil.getSession();
        String tablePath = PathUtil.getTxnDataPath("/rm_base", "test_table");
        Stat tempTwo = zk.exists(tablePath, false);
        assertTrue(tempTwo != null);

        String cfPath = PathUtil.getTxnDataPath("/rm_base", "test_table") + "/cf1";
        Stat tempThree = zk.exists(cfPath, false);
        assertTrue(tempThree != null);

        hcatDriver.run("drop table test_table");

        System.out.println("Table path : " + tablePath);
        Stat tempFour = zk.exists(tablePath, false);
        assertTrue(tempFour == null);

    }

}
