package javasmmr.zoowsome.models.employees;

import static javasmmr.zoowsome.repositories.EntityRepository.createNode;

import java.math.BigDecimal;
import java.util.UUID;

import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLStreamException;

import org.w3c.dom.Element;

import javasmmr.zoowsome.models.interfaces.XML_Parsable;

/**
 * 
 * @author Marius Bologa
 *
 */
public abstract class Employee implements XML_Parsable {
	/**
	 * 
	 * @param name
	 *            The name of the employee.
	 * 
	 * @param id
	 *            Id.
	 * @param salary
	 *            The salary.
	 */
	public Employee(final String name, final UUID id, final BigDecimal salary) {
		super();
		this.name = name;
		this.id = id;
		this.salary = salary;
	}

	/**
	 * 
	 */
	private String name;
	/**
	 * 
	 */
	private boolean isDead = false;
	/**
	 * 
	 */
	UUID id;

	/**
	 * 
	 * @return The name of the employee.
	 */
	public final String getName() {
		return name;
	}

	/**
	 * 
	 * @param name
	 *            Of the employee.
	 */
	public final void setName(final String name) {
		this.name = name;
	}

	/**
	 * 
	 * @return If he/she is dead.
	 */
	public final boolean isDead() {
		return isDead;
	}

	/**
	 * 
	 * @param isDead
	 *            .
	 */
	public final void setDead(final boolean isDead) {
		this.isDead = isDead;
	}

	/**
	 * 
	 * @return The id.
	 */
	public final UUID getId() {
		return id;
	}

	/**
	 * 
	 * @param id
	 *            The ID.
	 */

	public final void setId(final UUID id) {
		this.id = id;
	}

	/**
	 * 
	 * @return The salary of the employee.
	 */
	public final BigDecimal getSalary() {
		return salary;
	}

	/**
	 * 
	 * @param salary
	 *            The salary.
	 */
	public final void setSalary(final BigDecimal salary) {
		this.salary = salary;
	}

	/**
	 * 
	 */
	private BigDecimal salary;

	/**
	 * @param eventWriter
	 *            Text to encode.
	 * @throws XMLStreamException
	 *             .
	 */
	public void encodeToXml(final XMLEventWriter eventWriter) throws XMLStreamException {
		createNode(eventWriter, "name", String.valueOf(this.name));
		createNode(eventWriter, "isDead", String.valueOf(this.isDead));
		createNode(eventWriter, "ID", String.valueOf(this.id));
		createNode(eventWriter, "Salary", String.valueOf(this.salary));
	}

	/**
	 * @param element
	 *            Element to decode.
	 */
	public void decodeFromXml(final Element element) {
		setName(element.getElementsByTagName("name").item(0).getTextContent());
		setDead(Boolean.valueOf(element.getElementsByTagName("isDead").item(0).getTextContent()));
		setId(UUID.fromString(element.getElementsByTagName("id").item(0).getTextContent()));
		setSalary(BigDecimal.valueOf(Double.valueOf(element.getElementsByTagName("salary").item(0).getTextContent())));
	}
}