/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */
#include "cmWIXFeaturesSourceWriter.h"

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

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

    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, cmWIXPatch& patch)
{
    BeginElement("Feature");
    AddAttribute("Id", "CM_G_" + group.Name);

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

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

    patch.ApplyFragment("CM_G_" + group.Name, *this);

    for(cmCPackComponentGroup* subgroup : group.Subgroups)
    {
        EmitFeatureForComponentGroup(*subgroup, patch);
    }

    for(cmCPackComponent* component : group.Components)
    {
        EmitFeatureForComponent(*component, patch);
    }

    EndElement("Feature");
}

void
cmWIXFeaturesSourceWriter::EmitFeatureForComponent(
    cmCPackComponent const& component, cmWIXPatch& patch)
{
    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");
    }

    if(component.IsDisabledByDefault)
    {
        AddAttribute("Level", "2");
    }

    patch.ApplyFragment("CM_C_" + component.Name, *this);

    EndElement("Feature");
}

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