/*******************************************************************************
 * Copyright (c) 2004, 2007 Boeing.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Boeing - initial API and implementation
 *******************************************************************************/
package org.eclipse.osee.framework.ui.skynet.blam.operation;

import java.util.Arrays;
import java.util.Collection;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.osee.framework.core.data.IArtifactType;
import org.eclipse.osee.framework.core.enums.DeletionFlag;
import org.eclipse.osee.framework.core.util.XResultData;
import org.eclipse.osee.framework.jdk.core.util.AHTML;
import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
import org.eclipse.osee.framework.ui.skynet.blam.AbstractBlam;
import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
import org.eclipse.osee.framework.ui.skynet.results.XResultDataUI;

/**
 * Counts artifact of type or inherited type
 * 
 * @author Donald G. Dunne
 */
public class CountArtifactsOfTypeBlam extends AbstractBlam {

   @Override
   public String getName() {
      return "Count Artifacts of Type";
   }

   @Override
   public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
      if (variableMap.getBoolean("All Types")) {
         XResultData rd = new XResultData(false);
         rd.log(String.format("Aritfact Count for Type for Branch [%s]\n", variableMap.getBranch("Branch")));
         rd.addRaw(AHTML.beginMultiColumnTable(100, 1));
         rd.addRaw(AHTML.addHeaderRowMultiColumnTable(Arrays.asList("Type", "Count")));
         for (IArtifactType artType : ArtifactTypeManager.getAllTypes()) {
            int count =
               ArtifactQuery.getArtifactCountFromTypeWithInheritence(artType, variableMap.getBranch("Branch"),
                  DeletionFlag.EXCLUDE_DELETED);
            rd.addRaw(AHTML.addRowMultiColumnTable(artType.toString(), String.valueOf(count)));
         }
         rd.addRaw(AHTML.endMultiColumnTable());
         XResultDataUI.report(rd,"Artifact Type Count");
      } else {
         IArtifactType artType = variableMap.getArtifactType("Artifact Type");
         int count =
            ArtifactQuery.getArtifactCountFromTypeWithInheritence(artType, variableMap.getBranch("Branch"),
               DeletionFlag.EXCLUDE_DELETED);
         String str = String.format("\nAritfact Count for Type [%s] = %d\n\n", artType, count);
         logf(str);
      }
   }

   @Override
   public String getXWidgetsXml() {
      return "<xWidgets>" + //
      "<XWidget xwidgetType=\"XBranchSelectWidget\" displayName=\"Branch\" /> " + //
      "<XWidget xwidgetType=\"XCheckBox\" displayName=\"All Types\" /> " + //
      "<XWidget xwidgetType=\"XArtifactTypeComboViewer\" displayName=\"Artifact Type\" />" + //
      "</xWidgets>";
   }

   @Override
   public Collection<String> getCategories() {
      return Arrays.asList("Reports");
   }

   @Override
   public String getDescriptionUsage() {
      return "Count artifacts on specified branch by inherited type.";
   }
}