package net.pascalalma.xml;

import java.text.SimpleDateFormat;

import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;

import net.pascalalma.model.Employee;
import net.pascalalma.model.Holiday;
import net.pascalalma.model.HolidayRequest;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class HolidayRequestReader
{
  private static final Log LOG = LogFactory.getLog(HolidayRequestReader.class);

  private static final QName ROOT_TAG = new QName(
      "http://www.pascalalma.net/hr/schemas", "HolidayRequest");

  private static final SimpleDateFormat dateFormat = new SimpleDateFormat(
      "yyyy-MM-dd");

  public static HolidayRequest parseMessage(XMLStreamReader xmlReader)
      throws Exception
  {

    HolidayRequest result = null;
    try
    {
      while (xmlReader.hasNext())
      {
        switch (xmlReader.getEventType())
        {

        case XMLStreamConstants.START_DOCUMENT:
          LOG.info("Document started");
          break;

        case XMLStreamConstants.START_ELEMENT:
          if (ROOT_TAG.equals(xmlReader.getName()))
          {
            // Start of the xml-message.
            result = extractMessage(xmlReader);
          }
          break;

        case XMLStreamConstants.END_DOCUMENT:
          LOG.info("Document ended");
          break;

        default:
          LOG.info("unimplemented event type: " + xmlReader.getEventType());
        }
        if (xmlReader.hasNext())
        {
          xmlReader.next();
        }
      }
    } catch (XMLStreamException e)
    {
      throw new Exception(e);
    }

    return result;

  }

  /**
   * 
   * @param xmlReader
   *          the batch xml
   */

  private static HolidayRequest extractMessage(XMLStreamReader xmlReader)
      throws Exception
  {

    HolidayRequest holidayReq = new HolidayRequest();
    Holiday holiday = new Holiday();
    Employee emp = new Employee();

    try
    {
      xmlReader.next();
      String value = null;
      myloop: while (xmlReader.hasNext())
      {

        switch (xmlReader.getEventType())
        {

        case XMLStreamConstants.ATTRIBUTE:
          // ignore
          break;

        case XMLStreamConstants.START_ELEMENT:
          // Copy the start element
          LOG.debug("Starting to read " + xmlReader.getLocalName());
          value = null;
          break;

        case XMLStreamConstants.END_ELEMENT:
          if (ROOT_TAG.equals(xmlReader.getName()))
          {
            // We are finished here so quit the loop
            break myloop;
          } else if ("Holiday".equals(xmlReader.getLocalName()))
          {
            holidayReq.setHoliday(holiday);
          } else if ("StartDate".equals(xmlReader.getLocalName()))
          {
            holiday.setStartDate(dateFormat.parse(value));
          } else if ("EndDate".equals(xmlReader.getLocalName()))
          {
            holiday.setEndDate(dateFormat.parse(value));
          } else if ("Employee".equals(xmlReader.getLocalName()))
          {
            holidayReq.setEmployee(emp);
          } else if ("Number".equals(xmlReader.getLocalName()))
          {
            emp.setNumber(Long.parseLong(value));
          } else if ("FirstName".equals(xmlReader.getLocalName()))
          {
            emp.setFirstName(value);
          } else if ("LastName".equals(xmlReader.getLocalName()))
          {
            emp.setLastName(value);
          }
        case XMLStreamConstants.SPACE:
          // ignore spaces
          break;

        case XMLStreamConstants.CHARACTERS:
          value = xmlReader.getText();
          break;

        default:
          LOG.info("Unknown eventType = " + xmlReader.getEventType());
        }

        // move to next event
        if (xmlReader.hasNext())
        {
          xmlReader.next();
        }

      } // end Loop

    } catch (XMLStreamException e)
    {
      throw new Exception(e);
    }
    return holidayReq;
  }

}

