/*******************************************************************************
 * Copyright (c) 2002, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.ws.internal.explorer.platform.wsdl.fragment;

import org.eclipse.emf.common.util.EList;
import org.eclipse.wst.ws.internal.explorer.platform.constants.*;
import org.eclipse.wst.ws.internal.explorer.platform.wsdl.constants.*;
import org.eclipse.wst.ws.internal.explorer.platform.wsdl.fragment.impl.*;
import org.eclipse.wst.ws.internal.explorer.platform.wsdl.fragment.util.*;
import org.eclipse.wst.ws.internal.explorer.platform.wsdl.xsd.*;
import org.eclipse.xsd.*;

public class XSDSimpleTypeToFragmentMapper extends XSDToFragmentMapper {
  public XSDSimpleTypeToFragmentMapper(XSDToFragmentController controller, WSDLPartsToXSDTypeMapper wsdlToXSDMapper) {
    super(controller, wsdlToXSDMapper);
  }

  public IXSDFragment getFragment(XSDToFragmentConfiguration config, String id, String name) {
    XSDSimpleTypeDefinition simpleType = (XSDSimpleTypeDefinition)config.getXSDComponent();
    if (simpleType != null && simpleType.getVariety() != null) {
      switch (simpleType.getVariety().getValue()) {
        case XSDVariety.ATOMIC:
          return getXSDSimpleAtomicFragment(config, id, name);
        case XSDVariety.LIST:
          return getXSDSimpleListFragment(config, id, name);
        case XSDVariety.UNION:
          return getXSDSimpleUnionFragment(config, id, name);
        default:
          return getXSDDefaultFragment(config, id, name);
      }
    }
    else
      return getXSDDefaultFragment(config, id, name);
  }

  private IXSDFragment getXSDSimpleAtomicFragment(XSDToFragmentConfiguration config, String id, String name) {
    boolean isFixed = ((config.getMinOccurs() == config.getMaxOccurs()) && config.getMaxOccurs() != FragmentConstants.UNBOUNDED);
    XSDSimpleTypeDefinition xsdSimpleTypeDef = (XSDSimpleTypeDefinition)config.getXSDComponent();
    XSDSimpleTypeDefinition xsdBaseSimpleTypeDef = (XSDSimpleTypeDefinition)XSDTypeDefinitionUtil.resolveToXSDBuiltInTypeDefinition(xsdSimpleTypeDef);
    String baseSimpleTypeDefNS = null;
    String baseSimpleTypeDefName = null;
    if (xsdBaseSimpleTypeDef != null)
    {
      baseSimpleTypeDefNS = xsdBaseSimpleTypeDef.getTargetNamespace();
      baseSimpleTypeDefName = xsdBaseSimpleTypeDef.getName();
    }
    boolean isEnum = isSimpleTypeEnumeration(xsdSimpleTypeDef);
    if (FragmentConstants.URI_XSD.equals(baseSimpleTypeDefNS))
    {
      if (baseSimpleTypeDefName.equals("date"))
        return getXSDSimpleDateTimeFragment(id, name, config, ActionInputs.CALENDAR_TYPE_DATE,xsdSimpleTypeDef,isEnum,isFixed);
      else if (baseSimpleTypeDefName.equals("dateTime"))
        return getXSDSimpleDateTimeFragment(id, name, config, ActionInputs.CALENDAR_TYPE_DATETIME,xsdSimpleTypeDef,isEnum,isFixed);
      else if (baseSimpleTypeDefName.equals("gYearMonth"))
        return getXSDSimpleDateTimeFragment(id, name, config, ActionInputs.CALENDAR_TYPE_GYEARMONTH,xsdSimpleTypeDef,isEnum,isFixed);
      else if (baseSimpleTypeDefName.equals("gMonthDay"))
        return getXSDSimpleDateTimeFragment(id, name, config, ActionInputs.CALENDAR_TYPE_GMONTHDAY,xsdSimpleTypeDef,isEnum,isFixed);
      else if (baseSimpleTypeDefName.equals("gDay"))
        return getXSDSimpleGDayFragment(id, name, config, xsdSimpleTypeDef,isEnum,isFixed);        
      else if (baseSimpleTypeDefName.equals("boolean"))
        return getXSDSimpleBooleanFragment(id, name, config, xsdSimpleTypeDef,isEnum,isFixed);
    }

    if (isEnum)
    {
      if (isFixed)
        return new XSDSimpleAtomicEnumFixFragment(id, name, config, xsdSimpleTypeDef.getEnumerationFacets());
      else
        return new XSDSimpleAtomicEnumRangeFragment(id, name, config, xsdSimpleTypeDef.getEnumerationFacets());
    }
    else
    {
      if (isFixed)
        return new XSDSimpleAtomicFixFragment(id, name, config);
      else
        return new XSDSimpleAtomicRangeFragment(id, name, config);
    }
  }

  private XSDSimpleAtomicFragment getXSDSimpleDateTimeFragment(String id, String name, XSDToFragmentConfiguration config, int calendarType,XSDSimpleTypeDefinition xsdDateTimeType,boolean isEnum,boolean isFixed)
  {
    if (isEnum)
    {
      if (isFixed)
        return new XSDSimpleAtomicEnumFixFragment(id, name, config, xsdDateTimeType.getEnumerationFacets());
      else
        return new XSDSimpleAtomicEnumRangeFragment(id, name, config, xsdDateTimeType.getEnumerationFacets());
    }
    else
    {
      if (isFixed)
        return new XSDSimpleAtomicDateTimeFixFragment(id, name, config, calendarType);
      else
        return new XSDSimpleAtomicDateTimeRangeFragment(id, name, config, calendarType);
    }
  }
  
  private XSDSimpleAtomicFragment getXSDSimpleGDayFragment(String id, String name, XSDToFragmentConfiguration config, XSDSimpleTypeDefinition xsdDateTimeType,boolean isEnum,boolean isFixed)
  {
    if (isEnum)
      return null;
    OptionVector optionVector = new OptionVector();
    StringBuffer value = new StringBuffer();
    for (int i=1;i<=31;i++)
    {
      value.setLength(0);
      value.append("---");
      if (i<10)
        value.append(0);
      value.append(i);
      optionVector.addOption(String.valueOf(i),value.toString());
    }
    if (isFixed)
      return new XSDSimpleAtomicEnumFixFragment(id, name, config, optionVector);
    else
      return new XSDSimpleAtomicEnumRangeFragment(id, name, config, optionVector);
  }

  private XSDSimpleAtomicFragment getXSDSimpleBooleanFragment(String id, String name, XSDToFragmentConfiguration config, XSDSimpleTypeDefinition xsdBooleanType,boolean isEnum,boolean isFixed)
  {
    if (isEnum)
      return null;
    OptionVector optionVector = new OptionVector();
    optionVector.addOption("true","true");
    optionVector.addOption("false","false");
    if (isFixed)
      return new XSDSimpleAtomicEnumFixFragment(id, name, config, optionVector);
    else
      return new XSDSimpleAtomicEnumRangeFragment(id, name, config, optionVector);
  }

  private IXSDFragment getXSDSimpleListFragment(XSDToFragmentConfiguration config, String id, String name) {
    IXSDSimpleListFragment frag;
    boolean isFixed = ((config.getMinOccurs() == config.getMaxOccurs()) && config.getMaxOccurs() != FragmentConstants.UNBOUNDED);
    if (isFixed)
      return new XSDSimpleListFixFragment(id, name, config, getController());
    else
      return new XSDSimpleListRangeFragment(id, name, config, getController());
  }

  private IXSDFragment getXSDSimpleUnionFragment(XSDToFragmentConfiguration config, String id, String name) {
    IXSDSimpleUnionFragment frag;
    boolean isFixed = ((config.getMinOccurs() == config.getMaxOccurs()) && config.getMaxOccurs() != FragmentConstants.UNBOUNDED);
    if (isFixed)
      return new XSDSimpleUnionFixFragment(id, name, config, getController());
    else
      return new XSDSimpleUnionRangeFragment(id, name, config, getController());
  }

  private boolean isSimpleTypeEnumeration(XSDSimpleTypeDefinition simpleType) {
    EList e = simpleType.getEnumerationFacets();
    return (e != null && e.size() > 0);
  }
}
