/*
 * 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.gwt.editor.rebind.model;

import com.google.web.bindery.autobean.shared.ValueCodex;
import com.google.gwt.core.ext.typeinfo.JArrayType;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JParameterizedType;
import com.google.gwt.core.ext.typeinfo.JType;
import com.google.gwt.core.ext.typeinfo.TypeOracle;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

/**
 * Utility class for common model methods.
 */
public class ModelUtils {

  static final Set<String> VALUE_TYPE_NAMES;

  static {
    Set<Class<?>> valueTypes = ValueCodex.getAllValueTypes();
    Set<String> names = new HashSet<String>(valueTypes.size());
    for (Class<?> clazz : valueTypes) {
      names.add(clazz.getName());
    }
    VALUE_TYPE_NAMES = Collections.unmodifiableSet(names);
  }

  @SuppressWarnings("unchecked")
  public static <T extends JType> T ensureBaseType(T maybeParameterized) {
    if (maybeParameterized.isArray() != null) {
      JArrayType array = maybeParameterized.isArray();
      return (T) array.getOracle().getArrayType(
          ensureBaseType(array.getComponentType()));
    }
    if (maybeParameterized.isTypeParameter() != null) {
      return (T) maybeParameterized.isTypeParameter().getBaseType();
    }
    if (maybeParameterized.isParameterized() != null) {
      return (T) maybeParameterized.isParameterized().getBaseType();
    }
    if (maybeParameterized.isRawType() != null) {
      return (T) maybeParameterized.isRawType().getBaseType();
    }
    if (maybeParameterized.isWildcard() != null) {
      return (T) maybeParameterized.isWildcard().getBaseType();
    }
    return maybeParameterized;
  }

  public static JClassType[] findParameterizationOf(JClassType intfType,
      JClassType subType) {
    assert intfType.isAssignableFrom(subType) : subType.getParameterizedQualifiedSourceName()
        + " is not assignable to "
        + subType.getParameterizedQualifiedSourceName();

    for (JClassType supertype : subType.getFlattenedSupertypeHierarchy()) {
      JParameterizedType parameterized = supertype.isParameterized();
      if (parameterized != null) {
        // Found the desired supertype
        if (intfType.equals(parameterized.getBaseType())) {
          return parameterized.getTypeArgs();
        }
      }
    }
    return null;
  }

  /**
   * Given a JType, return the binary name of the class that is most proximately
   * assignable to the type. This method will resolve type parameters as well as
   * wildcard types.
   */
  public static String getQualifiedBaseBinaryName(JType type) {
    return ensureBaseType(type).getErasedType().getQualifiedBinaryName();
  }

  /**
   * Given a JType, return the source name of the class that is most proximately
   * assignable to the type. This method will resolve type parameters as well as
   * wildcard types.
   */
  public static String getQualifiedBaseSourceName(JType type) {
    return ensureBaseType(type).getErasedType().getQualifiedSourceName();
  }

  public static boolean isValueType(TypeOracle oracle, JType type) {
    JClassType classType = type.isClassOrInterface();
    if (classType == null) {
      return true;
    }
    if (type.isEnum() != null) {
      return true;
    }

    for (String valueType : VALUE_TYPE_NAMES) {
      JClassType found = oracle.findType(valueType);
      // null check to accommodate limited mock CompilationStates
      if (found != null && found.equals(classType)) {
        return true;
      }
    }
    return false;
  }

  private ModelUtils() {
  }
}
