package org.mariadb.jdbc;

import java.util.Arrays;
import java.util.Objects;
import javax.transaction.xa.Xid;

/** MariaDB XID implementation */
public class MariaDbXid implements Xid {

  private final int formatId;
  private final byte[] globalTransactionId;
  private final byte[] branchQualifier;

  /**
   * Global transaction identifier.
   *
   * @param formatId the format identifier part of the XID.
   * @param globalTransactionId the global transaction identifier part of XID as an array of bytes.
   * @param branchQualifier the transaction branch identifier part of XID as an array of bytes.
   */
  public MariaDbXid(int formatId, byte[] globalTransactionId, byte[] branchQualifier) {
    this.formatId = formatId;
    this.globalTransactionId = globalTransactionId;
    this.branchQualifier = branchQualifier;
  }

  /**
   * Equal implementation.
   *
   * @param obj object to compare
   * @return true if object is MariaDbXi and as same parameters
   */
  public boolean equals(Object obj) {
    if (obj instanceof Xid) {
      Xid other = (Xid) obj;
      return formatId == other.getFormatId()
          && Arrays.equals(globalTransactionId, other.getGlobalTransactionId())
          && Arrays.equals(branchQualifier, other.getBranchQualifier());
    }
    return false;
  }

  @Override
  public int hashCode() {
    int result = Objects.hash(formatId);
    result = 31 * result + Arrays.hashCode(globalTransactionId);
    result = 31 * result + Arrays.hashCode(branchQualifier);
    return result;
  }

  /**
   * Get format id from XID
   *
   * @return format id
   */
  public int getFormatId() {
    return formatId;
  }

  /**
   * Get global transaction id from XID
   *
   * @return global transaction id
   */
  public byte[] getGlobalTransactionId() {
    return globalTransactionId;
  }

  /**
   * Get branch qualifier from XID
   *
   * @return branch qualifier
   */
  public byte[] getBranchQualifier() {
    return branchQualifier;
  }
}
