/*
 * Copyright (c) 2013, the Dart project authors.
 * 
 * Licensed under the Eclipse Public License v1.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.eclipse.org/legal/epl-v10.html
 * 
 * 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.dart.tools.debug.ui.internal.objectinspector;

import com.google.dart.tools.debug.core.dartium.DartiumDebugValue;
import com.google.dart.tools.debug.core.dartium.DartiumDebugVariable;
import com.google.dart.tools.debug.core.server.ServerDebugValue;
import com.google.dart.tools.debug.core.server.ServerDebugVariable;

import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.core.runtime.IAdapterManager;
import org.eclipse.core.runtime.Platform;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IVariable;
import org.eclipse.ui.IActionFilter;

/**
 * An IActionFilter implementation used to determine whether inspect actions apply to certain
 * objects, and to manage the enablement state of those actions.
 */
public class InspectorActionFilter implements IActionFilter {

  static class InspectorAdapterFactory implements IAdapterFactory {
    private InspectorActionFilter inspectorFilter = new InspectorActionFilter();

    public InspectorAdapterFactory() {

    }

    @Override
    @SuppressWarnings("rawtypes")
    public Object getAdapter(Object adaptableObject, Class adapterType) {
      return inspectorFilter;
    }

    @SuppressWarnings("rawtypes")
    @Override
    public Class[] getAdapterList() {
      return new Class[] {IActionFilter.class};
    }
  }

  public static void registerAdapters() {
    IAdapterManager manager = Platform.getAdapterManager();

    IAdapterFactory factory = new InspectorAdapterFactory();

    manager.registerAdapters(factory, ServerDebugVariable.class);
    manager.registerAdapters(factory, DartiumDebugVariable.class);
    manager.registerAdapters(factory, InspectorVariable.class);
  }

  public InspectorActionFilter() {

  }

  @Override
  public boolean testAttribute(Object object, String name, String value) {
    if ("isInspectableObject".equals(name)) {
      return Boolean.toString(isInspectableObject(object)).equals(value);
    } else if ("canInspectObject".equals(name)) {
      return Boolean.toString(canInspectObject(object)).equals(value);
    } else if ("canInspectClass".equals(name)) {
      return Boolean.toString(canInspectClass(object)).equals(value);
    } else if ("canInspectLibrary".equals(name)) {
      return Boolean.toString(canInspectLibrary(object)).equals(value);
    } else {
      return false;
    }
  }

  private boolean canInspectClass(Object object) {
    if (!isInspectableObject(object)) {
      return false;
    }

    if (object instanceof IVariable) {
      IVariable variable = (IVariable) object;

      try {
        object = variable.getValue();
      } catch (DebugException e) {
        return false;
      }
    }

    if (isPrimitive(object)) {
      return false;
    }

    return true;
  }

  private boolean canInspectLibrary(Object object) {
    if (!isInspectableObject(object)) {
      return false;
    }

    if (object instanceof IVariable) {
      IVariable variable = (IVariable) object;

      try {
        object = variable.getValue();
      } catch (DebugException e) {
        return false;
      }
    }

    if (isPrimitive(object)) {
      return false;
    }

    return true;
  }

  private boolean canInspectObject(Object object) {
    if (!isInspectableObject(object)) {
      return false;
    }

    if (object instanceof InspectorVariable) {
      return false;
    }

    return true;
  }

  private boolean isInspectableObject(Object object) {
    return object instanceof ServerDebugVariable || object instanceof DartiumDebugVariable
        || object instanceof InspectorVariable;
  }

  private boolean isPrimitive(Object object) {
    if (object instanceof DartiumDebugValue) {
      DartiumDebugValue val = (DartiumDebugValue) object;

      if (val.isPrimitive()) {
        return true;
      }
    } else if (object instanceof ServerDebugValue) {
      ServerDebugValue val = (ServerDebugValue) object;

      if (val.isPrimitive()) {
        return true;
      }
    }

    return false;
  }
}
