/*
GanttProject is an opensource project management tool. License: GPL3
Copyright (C) 2011 GanttProject Team

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
package net.sourceforge.ganttproject.io;

import net.sourceforge.ganttproject.CustomProperty;
import net.sourceforge.ganttproject.CustomPropertyDefinition;
import net.sourceforge.ganttproject.CustomPropertyManager;
import net.sourceforge.ganttproject.IGanttProject;
import net.sourceforge.ganttproject.resource.HumanResource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;

import javax.xml.transform.sax.TransformerHandler;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

class ResourceSaver extends SaverBase {
  void save(IGanttProject project, TransformerHandler handler) throws SAXException {
    final AttributesImpl attrs = new AttributesImpl();
    startElement("resources", handler);
    saveCustomColumnDefinitions(project, handler);
    HumanResource[] resources = project.getHumanResourceManager().getResourcesArray();
    for (int i = 0; i < resources.length; i++) {
      HumanResource p = resources[i];
      addAttribute("id", p.getId(), attrs);
      addAttribute("name", p.getName(), attrs);
      addAttribute("function", p.getRole().getPersistentID(), attrs);
      addAttribute("contacts", p.getMail(), attrs);
      addAttribute("phone", p.getPhone(), attrs);
      startElement("resource", attrs, handler);
      {
        saveRates(p, handler);
        saveCustomProperties(project, p, handler);
      }
      endElement("resource", handler);
    }
    endElement("resources", handler);
  }

  private void saveRates(HumanResource p, TransformerHandler handler) throws SAXException {
    if (!BigDecimal.ZERO.equals(p.getStandardPayRate())) {
      AttributesImpl attrs = new AttributesImpl();
      addAttribute("name", "standard", attrs);
      addAttribute("value", p.getStandardPayRate().toPlainString(), attrs);
      emptyElement("rate", attrs, handler);
    }
  }

  private void saveCustomProperties(IGanttProject project, HumanResource resource, TransformerHandler handler)
      throws SAXException {
    // CustomPropertyManager customPropsManager =
    // project.getHumanResourceManager().getCustomPropertyManager();
    AttributesImpl attrs = new AttributesImpl();
    List<CustomProperty> properties = resource.getCustomProperties();
    for (int i = 0; i < properties.size(); i++) {
      CustomProperty nextProperty = properties.get(i);
      CustomPropertyDefinition nextDefinition = nextProperty.getDefinition();
      assert nextProperty != null : "WTF? null property in properties=" + properties;
      assert nextDefinition != null : "WTF? null property definition for property=" + i + "(value="
          + nextProperty.getValueAsString() + ")";
      if (nextProperty.getValue() != null && !nextProperty.getValue().equals(nextDefinition.getDefaultValue())) {
        addAttribute("definition-id", nextDefinition.getID(), attrs);
        addAttribute("value", nextProperty.getValueAsString(), attrs);
        emptyElement("custom-property", attrs, handler);
      }
    }
  }

  private void saveCustomColumnDefinitions(IGanttProject project, TransformerHandler handler) throws SAXException {
    CustomPropertyManager customPropsManager = project.getHumanResourceManager().getCustomPropertyManager();
    List<CustomPropertyDefinition> definitions = customPropsManager.getDefinitions();
    // HumanResourceManager hrManager = (HumanResourceManager)
    // project.getHumanResourceManager();
    // Map customFields = hrManager.getCustomFields();
    // if (customFields.size()==0) {
    // return;
    // }
    final AttributesImpl attrs = new AttributesImpl();
    // startElement("custom-properties-definition", handler);
    for (int i = 0; i < definitions.size(); i++) {
      // ResourceColumn nextField = (ResourceColumn) fields.next();
      CustomPropertyDefinition nextDefinition = definitions.get(i);
      addAttribute("id", nextDefinition.getID(), attrs);
      addAttribute("name", nextDefinition.getName(), attrs);
      addAttribute("type", nextDefinition.getTypeAsString(), attrs);
      addAttribute("default-value", nextDefinition.getDefaultValueAsString(), attrs);
      for (Map.Entry<String,String> kv : nextDefinition.getAttributes().entrySet()) {
        addAttribute(kv.getKey(), kv.getValue(), attrs);
      }
      emptyElement("custom-property-definition", attrs, handler);
    }
    // endElement("custom-properties-definition", handler);
  }
}