/*============================================================================
  CMake - Cross Platform Makefile Generator
  Copyright 2014 Kitware, Inc.

  Distributed under the OSI-approved BSD License (the "License");
  see accompanying file Copyright.txt for details.

  This software is distributed WITHOUT ANY WARRANTY; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the License for more information.
============================================================================*/

#include "cmWIXFeaturesSourceWriter.h"

cmWIXFeaturesSourceWriter::cmWIXFeaturesSourceWriter(
  cmCPackLog* logger, std::string const& filename)
  : cmWIXSourceWriter(logger, filename)
{
}

void cmWIXFeaturesSourceWriter::CreateCMakePackageRegistryEntry(
  std::string const& package, std::string const& upgradeGuid)
{
  BeginElement("Component");
  AddAttribute("Id", "CM_PACKAGE_REGISTRY");
  AddAttribute("Directory", "TARGETDIR");
  AddAttribute("Guid", "*");

  std::string registryKey =
    std::string("Software\\Kitware\\CMake\\Packages\\") + package;

  BeginElement("RegistryValue");
  AddAttribute("Root", "HKLM");
  AddAttribute("Key", registryKey);
  AddAttribute("Name", upgradeGuid);
  AddAttribute("Type", "string");
  AddAttribute("Value", "[INSTALL_ROOT]");
  AddAttribute("KeyPath", "yes");
  EndElement("RegistryValue");

  EndElement("Component");
}

void cmWIXFeaturesSourceWriter::EmitFeatureForComponentGroup(
  cmCPackComponentGroup const& group)
{
  BeginElement("Feature");
  AddAttribute("Id", "CM_G_" + group.Name);

  if (group.IsExpandedByDefault) {
    AddAttribute("Display", "expand");
  }

  AddAttributeUnlessEmpty("Title", group.DisplayName);
  AddAttributeUnlessEmpty("Description", group.Description);

  for (std::vector<cmCPackComponentGroup*>::const_iterator i =
         group.Subgroups.begin();
       i != group.Subgroups.end(); ++i) {
    EmitFeatureForComponentGroup(**i);
  }

  for (std::vector<cmCPackComponent*>::const_iterator i =
         group.Components.begin();
       i != group.Components.end(); ++i) {
    EmitFeatureForComponent(**i);
  }

  EndElement("Feature");
}

void cmWIXFeaturesSourceWriter::EmitFeatureForComponent(
  cmCPackComponent const& component)
{
  BeginElement("Feature");
  AddAttribute("Id", "CM_C_" + component.Name);

  AddAttributeUnlessEmpty("Title", component.DisplayName);
  AddAttributeUnlessEmpty("Description", component.Description);

  if (component.IsRequired) {
    AddAttribute("Absent", "disallow");
  }

  if (component.IsHidden) {
    AddAttribute("Display", "hidden");
  }

  EndElement("Feature");
}

void cmWIXFeaturesSourceWriter::EmitComponentRef(std::string const& id)
{
  BeginElement("ComponentRef");
  AddAttribute("Id", id);
  EndElement("ComponentRef");
}
