/**
 * 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 java.io.IOException;
import java.nio.charset.Charset;

import org.apache.hcatalog.hbase.snapshot.lock.LockListener;
import org.apache.hcatalog.hbase.snapshot.lock.WriteLock;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * This class generates revision id's for transactions.
 */
class IDGenerator implements LockListener {

    private ZooKeeper zookeeper;
    private String zNodeDataLoc;
    private String zNodeLockBasePath;
    private long id;
    private static final Logger LOG = LoggerFactory.getLogger(IDGenerator.class);

    IDGenerator(ZooKeeper zookeeper, String tableName, String idGenNode)
        throws IOException {
        this.zookeeper = zookeeper;
        this.zNodeDataLoc = idGenNode;
        this.zNodeLockBasePath = PathUtil.getLockManagementNode(idGenNode);
    }

    /**
     * This method obtains a revision id for a transaction.
     *
     * @return revision ID
     * @throws IOException
     */
    public long obtainID() throws IOException {
        WriteLock wLock = new WriteLock(zookeeper, zNodeLockBasePath, Ids.OPEN_ACL_UNSAFE);
        wLock.setLockListener(this);
        try {
            boolean lockGrabbed = wLock.lock();
            if (lockGrabbed == false) {
                //TO DO : Let this request queue up and try obtaining lock.
                throw new IOException("Unable to obtain lock to obtain id.");
            } else {
                id = incrementAndReadCounter();
            }
        } catch (KeeperException e) {
            LOG.warn("Exception while obtaining lock for ID.", e);
            throw new IOException("Exception while obtaining lock for ID.", e);
        } catch (InterruptedException e) {
            LOG.warn("Exception while obtaining lock for ID.", e);
            throw new IOException("Exception while obtaining lock for ID.", e);
        } finally {
            wLock.unlock();
        }
        return id;
    }

    /**
     * This method reads the latest revision ID that has been used. The ID
     * returned by this method cannot be used for transaction.
     * @return revision ID
     * @throws IOException
     */
    public long readID() throws IOException {
        long curId;
        try {
            Stat stat = new Stat();
            byte[] data = zookeeper.getData(this.zNodeDataLoc, false, stat);
            curId = Long.parseLong(new String(data, Charset.forName("UTF-8")));
        } catch (KeeperException e) {
            LOG.warn("Exception while reading current revision id.", e);
            throw new IOException("Exception while reading current revision id.", e);
        } catch (InterruptedException e) {
            LOG.warn("Exception while reading current revision id.", e);
            throw new IOException("Exception while reading current revision id.", e);
        }

        return curId;
    }


    private long incrementAndReadCounter() throws IOException {

        long curId, usedId;
        try {
            Stat stat = new Stat();
            byte[] data = zookeeper.getData(this.zNodeDataLoc, false, stat);
            usedId = Long.parseLong((new String(data, Charset.forName("UTF-8"))));
            curId = usedId + 1;
            String lastUsedID = String.valueOf(curId);
            zookeeper.setData(this.zNodeDataLoc, lastUsedID.getBytes(Charset.forName("UTF-8")), -1);

        } catch (KeeperException e) {
            LOG.warn("Exception while incrementing revision id.", e);
            throw new IOException("Exception while incrementing revision id. ", e);
        } catch (InterruptedException e) {
            LOG.warn("Exception while incrementing revision id.", e);
            throw new IOException("Exception while incrementing revision id. ", e);
        }

        return curId;
    }

    /*
     * @see org.apache.hcatalog.hbase.snapshot.lock.LockListener#lockAcquired()
     */
    @Override
    public void lockAcquired() {


    }

    /*
     * @see org.apache.hcatalog.hbase.snapshot.lock.LockListener#lockReleased()
     */
    @Override
    public void lockReleased() {

    }


}
