/*
 * Copyright 2010 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.web.bindery.autobean.shared.impl;

import com.google.web.bindery.autobean.gwt.client.impl.JsoSplittable;
import com.google.web.bindery.autobean.shared.Splittable;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.GwtScriptOnly;
import com.google.gwt.core.client.JavaScriptException;
import com.google.gwt.core.client.JsDate;
import com.google.gwt.core.client.JsonUtils;
import com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter;

import java.util.Date;

/**
 * This a super-source version with a client-only implementation.
 */
@GwtScriptOnly
public class StringQuoter {
  public static Splittable create(boolean value) {
    return JsoSplittable.create(value);
  }

  public static Splittable create(double value) {
    return JsoSplittable.create(value);
  }

  public static Splittable create(String value) {
    return JsoSplittable.create(value);
  }

  public static Splittable createIndexed() {
    return JsoSplittable.createIndexed();
  }

  public static Splittable createSplittable() {
    return JsoSplittable.create();
  }

  public static Splittable nullValue() {
    return JsoSplittable.nullValue();
  }

  public static String quote(String raw) {
    return JsonUtils.escapeValue(raw);
  }

  public static Splittable split(String payload) {
    char c = payload.charAt(0);
    boolean isSimple = c != '{' && c != '[';
    if (isSimple) {
      payload = "[" + payload + "]";
    }
    Splittable toReturn = JsonUtils.safeEval(payload).<JsoSplittable> cast();
    if (isSimple) {
      toReturn = toReturn.get(0);
    }
    return toReturn;
  }

  public static Date tryParseDate(String date) {
    try {
      return new Date(Long.parseLong(date));
    } catch (NumberFormatException ignored) {
    }
    try {
      JsDate js = JsDate.create(date);
      return new Date((long) js.getTime());
    } catch (JavaScriptException ignored) {
    }
    return null;
  }
}
