/*
 * Copyright 2016 The Bazel Authors. All rights reserved.
 *
 * 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.idea.blaze.base.lang.buildfile.findusages;

import com.google.idea.blaze.base.lang.buildfile.language.BuildFileType;
import com.google.idea.blaze.base.lang.buildfile.psi.BuildFile;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.usages.Usage;
import com.intellij.usages.UsageGroup;
import com.intellij.usages.UsageView;
import com.intellij.usages.impl.FileStructureGroupRuleProvider;
import com.intellij.usages.impl.rules.FileGroupingRule;
import com.intellij.usages.rules.UsageGroupingRule;
import com.intellij.usages.rules.UsageInFile;

import javax.swing.*;

/**
 * Allows us to customize the filename string in the 'find usages' dialog, rather than displaying them all as 'BUILD'.
 */
public class BuildFileGroupingRuleProvider implements FileStructureGroupRuleProvider {

  public static UsageGroupingRule getGroupingRule(Project project) {
    return new BuildFileGroupingRule(project);
  }

  @Override
  public UsageGroupingRule getUsageGroupingRule(Project project) {
    return getGroupingRule(project);
  }

  private static class BuildFileGroupingRule extends FileGroupingRule {

    private final Project project;

    BuildFileGroupingRule(Project project) {
      super(project);
      this.project = project;
    }

    @Override
    public UsageGroup groupUsage(Usage usage) {
      if (!(usage instanceof UsageInFile)) {
        return null;
      }
      final VirtualFile virtualFile = ((UsageInFile) usage).getFile();
      if (virtualFile.getFileType() != BuildFileType.INSTANCE) {
        return null;
      }
      return new FileUsageGroup(project, virtualFile) {
        String name;

        @Override
        public void update() {
          if (isValid()) {
            super.update();
            name = BuildFile.getBuildFileString(project, virtualFile.getPath());
          }
        }

        @Override
        public String getPresentableName() {
          return name;
        }

        @Override
        public String getText(UsageView view) {
          return name;
        }

        @Override
        public Icon getIcon(boolean isOpen) {
          return null; // already shown by default usage group (which we can't remove...)
        }
      };
    }
  }

}
