/**
 * 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.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * This class is responsible for storing information related to
 * transactions.
 */
public class Transaction implements Serializable {

    private String tableName;
    private List<String> columnFamilies = new ArrayList<String>();
    private long timeStamp;
    private long keepAlive;
    private long revision;


    Transaction(String tableName, List<String> columnFamilies, long revision, long timestamp) {
        this.tableName = tableName;
        this.columnFamilies = columnFamilies;
        this.timeStamp = timestamp;
        this.revision = revision;
    }

   /**
     * @return The revision number associated with a transaction.
     */
   public long getRevisionNumber(){
       return this.revision;
   }

    /**
     * @return The table name associated with a transaction.
     */
   public String getTableName() {
        return tableName;
    }

    /**
     * @return The column families associated with a transaction.
     */
   public List<String> getColumnFamilies() {
        return columnFamilies;
    }

    /**
     * @return The expire timestamp associated with a transaction.
     */
   long getTransactionExpireTimeStamp(){
        return this.timeStamp + this.keepAlive;
    }

    void setKeepAlive(long seconds){
        this.keepAlive = seconds;
    }

    /**
     * Gets the keep alive value.
     *
     * @return long  The keep alive value for the transaction.
     */
    public long getKeepAliveValue(){
        return this.keepAlive;
    }

    /**
     * Gets the family revision info.
     *
     * @return FamilyRevision An instance of FamilyRevision associated with the transaction.
     */
    FamilyRevision getFamilyRevisionInfo(){
        return new FamilyRevision(revision, getTransactionExpireTimeStamp());
    }

   /**
    * Keep alive transaction. This methods extends the expire timestamp of a
    * transaction by the "keep alive" amount.
    */
   void keepAliveTransaction(){
        this.timeStamp = this.timeStamp + this.keepAlive;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("Revision : ");
        sb.append(this.getRevisionNumber());
        sb.append(" Timestamp : ");
        sb.append(this.getTransactionExpireTimeStamp());
        sb.append("\n").append("Table : ");
        sb.append(this.tableName).append("\n");
        sb.append("Column Families : ");
        sb.append(this.columnFamilies.toString());
        return sb.toString();
    }
}
