// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package fuchsia.developer.plugin.fidl.psi;

import com.google.common.collect.ImmutableMap;
import com.intellij.extapi.psi.ASTWrapperPsiElement;
import com.intellij.lang.ASTNode;
import com.intellij.navigation.ItemPresentation;
import com.intellij.openapi.util.IconLoader;
import com.intellij.util.PlatformIcons;
import fuchsia.developer.plugin.fidl.psi.impl.FidlConstDeclarationImpl;
import fuchsia.developer.plugin.fidl.psi.impl.FidlLayoutDeclarationImpl;
import fuchsia.developer.plugin.fidl.psi.impl.FidlMemberFieldImpl;
import fuchsia.developer.plugin.fidl.psi.impl.FidlProtocolDeclarationImpl;
import fuchsia.developer.plugin.fidl.psi.impl.FidlProtocolEventImpl;
import fuchsia.developer.plugin.fidl.psi.impl.FidlProtocolMethodImpl;
import fuchsia.developer.plugin.fidl.psi.impl.FidlTypeAliasDeclarationImpl;
import java.util.Map;
import javax.swing.Icon;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public abstract class FidlNamedElementImpl extends ASTWrapperPsiElement
    implements FidlNamedElement {

  private static final Map<Class<? extends FidlNamedElementImpl>, Icon> icons;

  static {
    String path = "/fuchsia/developer/plugin/fidl/icons/";
    icons =
        ImmutableMap.<Class<? extends FidlNamedElementImpl>, Icon>builder()
            .put(FidlConstDeclarationImpl.class, IconLoader.getIcon(path + "C.png"))
            .put(FidlProtocolDeclarationImpl.class, IconLoader.getIcon(path + "P.png"))
            .put(FidlLayoutDeclarationImpl.class, IconLoader.getIcon(path + "T.png"))
            .put(FidlTypeAliasDeclarationImpl.class, IconLoader.getIcon(path + "U.png"))
            .put(FidlProtocolMethodImpl.class, IconLoader.getIcon(path + "M.png"))
            .put(FidlProtocolEventImpl.class, IconLoader.getIcon(path + "E.png"))
            .put(FidlMemberFieldImpl.class, IconLoader.getIcon(path + "F.png"))
            .build();
  }

  private final ItemPresentation presentation =
      new ItemPresentation() {
        @Nullable
        @Override
        public String getPresentableText() {
          return getIdentifierToken().getText();
        }

        @Nullable
        @Override
        public String getLocationString() {
          return "";
        }

        @Nullable
        @Override
        public Icon getIcon(boolean unused) {
          Icon value = icons.get(FidlNamedElementImpl.this.getClass());
          return (value == null) ? PlatformIcons.FOLDER_ICON : value;
        }
      };

  public FidlNamedElementImpl(@NotNull ASTNode node) {
    super(node);
  }

  @Override
  @Nullable
  public ItemPresentation getPresentation() {
    return presentation;
  }

  @Override
  public Icon getIcon(int flags) {
    return PlatformIcons.LIBRARY_ICON;
  }
}
