🏡 index : ~doyle/blockbuster.git

package wf.doyle.blockbuster.item;

import java.lang.reflect.Field;
import java.text.DecimalFormat;

import wf.doyle.blockbuster.App;
import wf.doyle.blockbuster.file.FileReader;
import wf.doyle.blockbuster.util.EnumLineType;

/**
 * Provides a base class for all items to extend.
 * 
 * @author Jordan Doyle
 */
public abstract class LibraryItem {
	/**
	 * Checks if the item currently on loan.
	 */
	private boolean onLoan = false;

	/**
	 * Amount of times the item has been taken.
	 */
	private int timesBorrowed = 0;

	/**
	 * URN of the item, as specified by the providing data file.
	 */
	private String itemCode;

	/**
	 * Cost of the item, as specified by the providing data file.
	 */
	private int cost;

	/**
	 * Name of the library item
	 */
	private String title;

	/**
	 * Gets the unique reference number of the item.
	 * 
	 * @return URN of item
	 */
	public String getItemCode()
	{
		return this.itemCode;
	}

	/**
	 * Gets the storage class type for this class.
	 * 
	 * @return type of storage class
	 */
	public abstract EnumLineType getType();

	/**
	 * Gets the name of the item provided by the data file.
	 * 
	 * @return name of item
	 */
	public String getName()
	{
		return this.title;
	}

	/**
	 * Gets the cost of the item.
	 * 
	 * @return cost of the item in pounds
	 */
	public String getCost()
	{
		return new DecimalFormat("'£'0.00").format((float)this.cost / 100);
	}

	/**
	 * Checks if the item is currently being loaned
	 * 
	 * @return true if the item is loaned out
	 */
	public boolean getLoan()
	{
		return this.onLoan;
	}

	/**
	 * Checks how many times this item has been borrowed from the library.
	 * Increments every time {@link #takeItem()} is called.
	 * 
	 * @return amount of times item has been borrowed
	 */
	public int getTimesBorrowed()
	{
		return this.timesBorrowed;
	}

	/**
	 * Takes the item from the library and increments the taken counter by 1.
	 */
	public void takeItem()
	{
		if(this.getLoan()) return;

		this.onLoan = true;
		this.timesBorrowed++;
	}

	/**
	 * Returns the item back to the library and let it be available again.
	 */
	public void returnItem()
	{
		if(!this.getLoan()) return;

		this.onLoan = false;
	}

	@Override
	public String toString()
	{
		String[] contains = FileReader.containing.get(this.getClass().getName());

		String string = "";

		for(String key : contains)
		{
			Class<? extends LibraryItem> child = FileReader.classes.get(this.getType());

			Field f = FileReader.getField(key.trim(), child);
			f.setAccessible(true);
			try
			{
				string = string + f.get(this) + ", ";
			}
			catch(IllegalArgumentException | IllegalAccessException e)
			{
				App.LOGGER.error("Could not get value of reflection field", e);
			}
		}

		return string.substring(0, string.lastIndexOf(","));
	}

	/**
	 * Toggles between taking the item and putting it back.
	 * 
	 * @return true if we now have the item
	 */
	public boolean toggleItem()
    {
	    if(this.getLoan()) {
	    	this.returnItem();
	    	return false;
	    } else {
	    	this.takeItem();
	    	return true;
	    }
    }
}