/**
 * This file is part of the Meeds project (https://meeds.io/).
 *
 * Copyright (C) 2020 - 2025 Meeds Association contact@meeds.io
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser 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 org.exoplatform.xml.object;

import java.util.Collection;
import java.util.Date;
import java.util.Map;

public class XMLBaseObject
{

   public static final String STRING = "string";

   public static final String INT = "int";

   public static final String LONG = "long";

   public static final String BOOLEAN = "boolean";

   public static final String FLOAT = "float";

   public static final String DOUBLE = "double";

   public static final String DATE = "date";

   public static final String MAP = "map";

   public static final String COLLECTION = "collection";

   public static final String ARRAY = "array";

   public static final String NATIVE_ARRAY = "native-array";

   public static final String OBJECT = "object";

   protected String type;

   protected Object value;

   public XMLBaseObject()
   {
   }

   public XMLBaseObject(Class<?> objecttype, Object val) throws Exception
   {
      if (val == null)
      {
         setType(objecttype);
      }
      else
      {
         setObjectValue(val);
      }
   }

   public String getType()
   {
      return type;
   }

   public void setType(String s)
   {
      type = s;
   }

   public void setType(Class<?> clazz)
   {
      if (String.class.equals(clazz))
         type = STRING;
      else if (Integer.class.equals(clazz))
         type = INT;
      else if (Long.class.equals(clazz))
         type = LONG;
      else if (Float.class.equals(clazz))
         type = FLOAT;
      else if (Double.class.equals(clazz))
         type = DOUBLE;
      else if (Boolean.class.equals(clazz))
         type = BOOLEAN;
      else if (Date.class.equals(clazz))
         type = DATE;
      else if (Map.class.equals(clazz))
         type = MAP;
      else if (Collection.class.equals(clazz))
         type = COLLECTION;
      else if (XMLNativeArray.isNativeArray(clazz))
         type = NATIVE_ARRAY;
      else
         type = OBJECT;
   }

   public Object getValue()
   {
      return value;
   }

   public void setValue(Object v)
   {
      value = v;
   }

   public Object getObjectValue() throws Exception
   {
      if (value instanceof XMLCollection)
         return ((XMLCollection)value).getCollection();
      if (value instanceof XMLMap)
         return ((XMLMap)value).getMap();
      if (value instanceof XMLNativeArray)
         return ((XMLNativeArray)value).getValue();
      if (value instanceof XMLObject)
         return ((XMLObject)value).toObject();
      return value;
   }

   public void setObjectValue(Object o) throws Exception
   {
      if (o instanceof String)
         setString((String)o);
      else if (o instanceof Integer)
         setInt((Integer)o);
      else if (o instanceof Long)
         setLong((Long)o);
      else if (o instanceof Float)
         setFloat((Float)o);
      else if (o instanceof Double)
         setDouble((Double)o);
      else if (o instanceof Boolean)
         setBoolean((Boolean)o);
      else if (o instanceof Date)
         setDate((Date)o);
      else if (o instanceof Map)
         setMapValue((Map<?, ?>)o);
      else if (o instanceof Collection)
         setCollectiontValue((Collection<?>)o);
      else if (o instanceof XMLObject)
         setObject((XMLObject)o);
      else if (XMLNativeArray.isNativeArray(o))
         setNativeArrayValue(o);
      else
         setObject(new XMLObject(o));
   }

   public XMLObject getObject()
   {
      if (value instanceof XMLObject)
         return (XMLObject)value;
      return null;
   }

   public void setObject(XMLObject o)
   {
      if (o == null)
         return;
      type = OBJECT;
      value = o;
   }

   public String getString()
   {
      if (value instanceof String)
         return (String)value;
      return null;
   }

   public void setString(String s)
   {
      if (s == null)
         return;
      type = STRING;
      value = s;
   }

   public Integer getInt()
   {
      if (value instanceof Integer)
         return (Integer)value;
      return null;
   }

   public void setInt(Integer i)
   {
      if (i == null)
         return;
      type = INT;
      value = i;
   }

   public Long getLong()
   {
      if (value instanceof Long)
         return (Long)value;
      return null;
   }

   public void setLong(Long l)
   {
      if (l == null)
         return;
      type = LONG;
      value = l;
   }

   public Float getFloat()
   {
      if (value instanceof Float)
         return (Float)value;
      return null;
   }

   public void setFloat(Float f)
   {
      if (f == null)
         return;
      type = DOUBLE;
      value = f;
   }

   public Double getDouble()
   {
      if (value instanceof Double)
         return (Double)value;
      return null;
   }

   public void setDouble(Double d)
   {
      if (d == null)
         return;
      type = FLOAT;
      value = d;
   }

   public Boolean getBoolean()
   {
      if (value instanceof Boolean)
         return (Boolean)value;
      return null;
   }

   public void setBoolean(Boolean b)
   {
      if (b == null)
         return;
      type = BOOLEAN;
      value = b;
   }

   public Date getDate()
   {
      if (value instanceof Date)
         return (Date)value;
      return null;
   }

   public void setDate(Date date)
   {
      if (date == null)
         return;
      type = DATE;
      value = date;
   }

   public XMLMap getMap()
   {
      if (value instanceof XMLMap)
         return (XMLMap)value;
      return null;
   }

   public void setMapValue(Map<?, ?> map) throws Exception
   {
      if (map == null)
         return;
      type = MAP;
      value = new XMLMap(map);
   }

   public void setMap(XMLMap map)
   {
      if (map == null)
         return;
      type = MAP;
      value = map;
   }

   public XMLCollection getCollection()
   {
      if (value instanceof XMLCollection)
         return (XMLCollection)value;
      return null;
   }

   public void setCollectiontValue(Collection<?> collection) throws Exception
   {
      if (collection == null)
         return;
      type = COLLECTION;
      value = new XMLCollection(collection);
   }

   public void setCollection(XMLCollection collection)
   {
      if (collection == null)
         return;
      type = COLLECTION;
      value = collection;
   }

   public XMLNativeArray getNativeArray()
   {
      if (value instanceof XMLNativeArray)
         return (XMLNativeArray)value;
      return null;
   }

   public void setNativeArrayValue(Object array) throws Exception
   {
      if (array == null)
         return;
      type = NATIVE_ARRAY;
      value = new XMLNativeArray(array);
   }

   public void setNativeArray(XMLNativeArray array)
   {
      if (array == null)
         return;
      type = NATIVE_ARRAY;
      value = array;
   }
}
