import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.HColumnDescriptor;

import java.io.IOException;

public class HBaseTest {
    public static void main(String[] args) {
        Connection connection = null;
        Admin admin = null;
        try {
            System.out.println(">>> 1. Initializing Configuration...");
            Configuration config = HBaseConfiguration.create();
            
            config.set("hbase.zookeeper.quorum", "zookeeper");
            config.set("hbase.zookeeper.property.clientPort", "2181");
            
            config.set("hbase.client.retries.number", "3");

            System.out.println(">>> 2. Connecting to HBase...");
            connection = ConnectionFactory.createConnection(config);
            admin = connection.getAdmin();
            System.out.println(">>> Connection Success!");

            TableName tableName = TableName.valueOf("student_java");

            System.out.println(">>> 3. Checking Table...");
            if (admin.tableExists(tableName)) {
                System.out.println(">>> Table exists, deleting it first (for test)...");
                admin.disableTable(tableName);
                admin.deleteTable(tableName);
            }

            System.out.println(">>> Creating Table 'student_java'...");
            TableDescriptorBuilder tableBuilder = TableDescriptorBuilder.newBuilder(tableName);
            ColumnFamilyDescriptor family = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("info")).build();
            tableBuilder.setColumnFamily(family);
            admin.createTable(tableBuilder.build());
            System.out.println(">>> Table Created!");

            System.out.println(">>> 4. Inserting Data...");
            Table table = connection.getTable(tableName);
            Put put = new Put(Bytes.toBytes("1001")); 
            put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes("student"));
            put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("os"), Bytes.toBytes("CachyOS"));
            table.put(put);
            System.out.println(">>> Insert Success!");

            System.out.println(">>> 5. Scanning Data...");
            Scan scan = new Scan();
            ResultScanner scanner = table.getScanner(scan);
            for (Result result : scanner) {
                System.out.println(">>> Found Row: " + result);
                String name = Bytes.toString(result.getValue(Bytes.toBytes("info"), Bytes.toBytes("name")));
                String os = Bytes.toString(result.getValue(Bytes.toBytes("info"), Bytes.toBytes("os")));
                System.out.println("    -> Name: " + name + ", OS: " + os);
            }
            scanner.close();
            table.close();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (admin != null) admin.close();
                if (connection != null) connection.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
