/*
 * Copyright (C) 2008-2009, Robin Rosenberg <robin.rosenberg@dewire.com>
 * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org> and others
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Distribution License v. 1.0 which is available at
 * https://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

package org.eclipse.jgit.transport;

import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectIdOwnerMap;

/**
 * Description of an object stored in a pack file, including offset.
 * <p>
 * When objects are stored in packs Git needs the ObjectId and the offset
 * (starting position of the object data) to perform random-access reads of
 * objects from the pack. This extension of ObjectId includes the offset.
 */
public class PackedObjectInfo extends ObjectIdOwnerMap.Entry {
	private long offset;

	private int crc;

	private int type = Constants.OBJ_BAD;

	private long sizeBeforeInflating;

	private long fullSize;

	PackedObjectInfo(final long headerOffset, final int packedCRC,
			final AnyObjectId id) {
		super(id);
		offset = headerOffset;
		crc = packedCRC;
	}

	/**
	 * Create a new structure to remember information about an object.
	 *
	 * @param id
	 *            the identity of the object the new instance tracks.
	 */
	public PackedObjectInfo(AnyObjectId id) {
		super(id);
	}

	/**
	 * Get offset in pack when object has been already written
	 *
	 * @return offset in pack when object has been already written, or 0 if it
	 *         has not been written yet
	 */
	public long getOffset() {
		return offset;
	}

	/**
	 * Set the offset in pack when object has been written to.
	 *
	 * @param offset
	 *            offset where written object starts
	 */
	public void setOffset(long offset) {
		this.offset = offset;
	}

	/**
	 * Get the 32 bit CRC checksum for the packed data.
	 *
	 * @return the 32 bit CRC checksum for the packed data.
	 */
	public int getCRC() {
		return crc;
	}

	/**
	 * Record the 32 bit CRC checksum for the packed data.
	 *
	 * @param crc
	 *            checksum of all packed data (including object type code,
	 *            inflated length and delta base reference) as computed by
	 *            {@link java.util.zip.CRC32}.
	 */
	public void setCRC(int crc) {
		this.crc = crc;
	}

	/**
	 * Get the object type.
	 *
	 * @return the object type. The default type is OBJ_BAD, which is considered
	 *         as unknown or invalid type.
	 * @since 4.9
	 */
	public int getType() {
		return type;
	}

	/**
	 * Record the object type if applicable.
	 *
	 * @param type
	 *            the object type.
	 * @since 4.9
	 */
	public void setType(int type) {
		this.type = type;
	}

	/**
	 * Size in storage
	 *
	 * @param sizeBeforeInflating
	 *            size before inflating
	 */
	void setSize(long sizeBeforeInflating) {
		this.sizeBeforeInflating = sizeBeforeInflating;
	}

	/**
	 * Size in storage (maybe deflated and/or deltified).
	 *
	 * This is the size in storage. In packs, this is the bytes used by the
	 * object contents (themselves or as deltas) compressed by zlib (deflated).
	 *
	 * @return size in storage
	 */
	long getSize() {
		return sizeBeforeInflating;
	}

	/**
	 * Real (materialized) size of the object (inflated, undeltified)
	 *
	 * @param size
	 *            size of the object in bytes, without compressing nor
	 *            deltifying
	 * @since 6.4
	 */
	public void setFullSize(long size) {
		this.fullSize = size;
	}

	/**
	 * Get full size (inflated, undeltified)
	 *
	 * @return size of the object (inflated, undeltified)
	 *
	 * @since 6.4
	 */
	public long getFullSize() {
		return fullSize;
	}
}
