/*
 * Copyright 2009 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.uibinder.rebind.model;

import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JField;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.rebind.MortalLogger;
import com.google.gwt.uibinder.rebind.UiBinderContext;

/**
 * Descriptor for a field of the owner class.
 * <p>
 * Please notice that some fields defined in the XML and in the generated binder
 * class may not be present in the owner class - for instance, they may not be
 * relevant to the code of the owner class.
 * The fields in the binder class are instead represented by an instance of
 * {@link com.google.gwt.uibinder.rebind.FieldWriter}.
 */
public class OwnerField {
  private final String name;
  private final OwnerFieldClass fieldType;
  private final boolean isProvided;

  /**
   * Constructor.
   *
   * @param field the field of the owner class
   * @param logger
   * @param context 
   */
  public OwnerField(JField field, MortalLogger logger, UiBinderContext context)
      throws UnableToCompleteException {
    this.name = field.getName();

    // Get the field type and ensure it's a class or interface
    JClassType fieldClassType = field.getType().isClassOrInterface();

    if (fieldClassType == null) {
      logger.die("Type for field " + name + " is not a class: "
          + field.getType().getSimpleSourceName());
    }

    this.fieldType = OwnerFieldClass.getFieldClass(fieldClassType, logger,
        context);

    // Get the UiField annotation and process it
    UiField annotation = field.getAnnotation(UiField.class);

    if (annotation == null) {
      logger.die("Field " + name + " is not annotated with @UiField");
    }

    isProvided = annotation.provided();
  }

  /**
   * Returns the name of the field in the owner class.
   */
  public String getName() {
    return name;
  }

  /**
   * Returns a descriptor for the type of the field.
   */
  public OwnerFieldClass getType() {
    return fieldType;
  }

  /**
   * Returns whether this field's value is provided by owner class.
   * If it's not provided, then it's the binder's responsibility to assign it.
   */
  public boolean isProvided() {
    return isProvided;
  }

  @Override
  public String toString() {
    return String.format("%s.%s#%s", fieldType.getRawType().getPackage(),
        fieldType.getRawType().getName(), name);
  }
}