package com.lowagie.text.pdf.collection;

import com.lowagie.text.pdf.PdfBoolean;
import com.lowagie.text.pdf.PdfDate;
import com.lowagie.text.pdf.PdfDictionary;
import com.lowagie.text.pdf.PdfName;
import com.lowagie.text.pdf.PdfNumber;
import com.lowagie.text.pdf.PdfObject;
import com.lowagie.text.pdf.PdfString;

/**
 * @author blowagie
 *
 */
public class PdfCollectionField extends PdfDictionary {
	/** A possible type of collection field. */
	public static final int TEXT = 0;
	/** A possible type of collection field. */
	public static final int DATE = 1;
	/** A possible type of collection field. */
	public static final int NUMBER = 2;
	/** A possible type of collection field. */
	public static final int FILENAME = 3;
	/** A possible type of collection field. */
	public static final int DESC = 4;
	/** A possible type of collection field. */
	public static final int MODDATE = 5;
	/** A possible type of collection field. */
	public static final int CREATIONDATE = 6;
	/** A possible type of collection field. */
	public static final int SIZE = 7;
	
	/** The type of the PDF collection field. */
	protected int type;

	/**
	 * Creates a PdfCollectionField.
	 * @param name		the field name
	 * @param type		the field type
	 */
	public PdfCollectionField(String name, int type) {
		super(PdfName.COLLECTIONFIELD);
		put(PdfName.N, new PdfString(name, PdfObject.TEXT_UNICODE));
		this.type = type;
		switch(type) {
		default:
			put(PdfName.SUBTYPE, PdfName.S);
			break;
		case DATE:
			put(PdfName.SUBTYPE, PdfName.D);
			break;
		case NUMBER:
			put(PdfName.SUBTYPE, PdfName.N);
			break;
		case FILENAME:
			put(PdfName.SUBTYPE, PdfName.F);
			break;
		case DESC:
			put(PdfName.SUBTYPE, PdfName.DESC);
			break;
		case MODDATE:
			put(PdfName.SUBTYPE, PdfName.MODDATE);
			break;
		case CREATIONDATE:
			put(PdfName.SUBTYPE, PdfName.CREATIONDATE);
			break;
		case SIZE:
			put(PdfName.SUBTYPE, PdfName.SIZE);
			break;
		}
	}
	
	/**
	 * The relative order of the field name. Fields are sorted in ascending order.
	 * @param i	a number indicating the order of the field
	 */
	public void setOrder(int i) {
		put(PdfName.O, new PdfNumber(i));
	}
	
	/**
	 * Sets the initial visibility of the field.
	 * @param visible	the default is true (visible)
	 */
	public void setVisible(boolean visible) {
		put(PdfName.V, new PdfBoolean(visible));
	}
	
	/**
	 * Indication if the field value should be editable in the viewer.
	 * @param editable	the default is false (not editable)
	 */
	public void setEditable(boolean editable) {
		put(PdfName.E, new PdfBoolean(editable));
	}

	/**
	 * Checks if the type of the field is suitable for a Collection Item.
	 */
	public boolean isCollectionItem() {
		switch(type) {
		case TEXT:
		case DATE:
		case NUMBER:
			return true;
		default:
			return false;
		}
	}
	
	/**
	 * Returns a PdfObject that can be used as the value of a Collection Item.
	 * @param v	value	the value that has to be changed into a PdfObject (PdfString, PdfDate or PdfNumber)	
	 */
	public PdfObject getValue(String v) {
		switch(type) {
		case TEXT:
			return new PdfString(v, PdfObject.TEXT_UNICODE);
		case DATE:
			return new PdfDate(PdfDate.decode(v));
		case NUMBER:
			return new PdfNumber(v);
		}
		throw new IllegalArgumentException(v + " is not an acceptable value for the field " + get(PdfName.N).toString());
	}
}