/*
 * Copyright 2015 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.gwt.dev.jjs.ast;

import com.google.gwt.dev.javac.JsInteropUtil;

import java.beans.Introspector;

/**
 * Abstracts JsInterop information for the AST nodes.
 */
public interface HasJsInfo extends HasJsName, CanBeJsNative {
  /**
   * Indicates type of JsMember.
   */
  enum JsMemberType {
    /**
     * Not a js member.
     */
    NONE {
      @Override
      public String computeName(JMember member) {
          return null;
      }
    },
    /**
     * A JsConstructor.
     */
    CONSTRUCTOR {
      @Override
      public String computeName(JMember member) {
        return "";
      }
    },
    /**
     * A JsMethod.
     */
    METHOD,
    /**
     * A JsProperty.
     */
    PROPERTY,
    /**
     * A getter JsProperty accessor. Usually in the form of getX()/isX().
     */
    GETTER("get") {
      @Override
      public String computeName(JMember member) {
        String methodName = member.getName();
        if (startsWithCamelCase(methodName, "get")) {
          return Introspector.decapitalize(methodName.substring(3));
        }
        if (startsWithCamelCase(methodName, "is")) {
          return Introspector.decapitalize(methodName.substring(2));
        }
        return JsInteropUtil.INVALID_JSNAME;
      }
      @Override
      public boolean isPropertyAccessor() {
        return true;
      }
    },
    /**
     * A setter JsProperty accessor. Usually in the form of setX(x).
     */
    SETTER("set") {
      @Override
      public String computeName(JMember member) {
        String methodName = member.getName();
        if (startsWithCamelCase(methodName, "set")) {
          return Introspector.decapitalize(methodName.substring(3));
        }
        return JsInteropUtil.INVALID_JSNAME;
      }
      @Override
      public boolean isPropertyAccessor() {
        return true;
      }
    },
    /**
     * A property accessor but doesn't match setter/getter patterns.
     */
    UNDEFINED_ACCESSOR;

    private String accessorKey;

    private JsMemberType() { }

    private JsMemberType(String accessorKey) {
      this.accessorKey = accessorKey;
    }

    public String getPropertyAccessorKey() {
      return accessorKey;
    }

    public boolean isPropertyAccessor() {
      return getPropertyAccessorKey() != null;
    }

    public String computeName(JMember member) {
      return member.getName();
    }

    private static boolean startsWithCamelCase(String string, String prefix) {
      return string.length() > prefix.length() && string.startsWith(prefix)
          && Character.isUpperCase(string.charAt(prefix.length()));
    }
  }

  void setJsMemberInfo(JsMemberType type, String namespace, String name, boolean exported);

  void setJsOverlay();

  JsMemberType getJsMemberType();

  boolean isJsMethodVarargs();

  boolean isJsOverlay();

  boolean canBeReferencedExternally();

  boolean canBeImplementedExternally();

  boolean isJsInteropEntryPoint();
}
