version = project.version
index = version.indexOf( '-' )
def productVersion = version
if ( index >= 0 ) {
  productVersion = version.substring( 0, index )
}

def repositoryComponentIds = []
def repositoryBasedir = new File(project.build.directory + "/repository/releases");
def generateGuid = { "{"+java.util.UUID.randomUUID().toString().toUpperCase() + "}" }
def visualStudioVersions = ['2005', '2008', '2010']

def addinArtifacts = []
new File(project.build.directory + "/addin").eachFile { addinArtifacts << it }

outputFile = new File(project.build.directory, "npanday.wxs")
outputFile.getParentFile().mkdirs()
def writer = outputFile.withWriter("UTF-8") { writer ->
  def builder = new groovy.xml.MarkupBuilder( writer )
  builder.Wix (xmlns:"http://schemas.microsoft.com/wix/2006/wi",
               'xmlns:netfx':"http://schemas.microsoft.com/wix/NetFxExtension",
               'xmlns:util':'http://schemas.microsoft.com/wix/UtilExtension') {

    Product( Id:"{9BB7FC88-853C-406E-92C0-A617ACD3E3B1}", Codepage:"1252", Language:"1033", Manufacturer:project.organization.name,
             Name:"NPanday " + version, UpgradeCode:"{A9239AE6-C0D5-41A2-A779-F427B2A32F3E}", Version:productVersion) {
      Package(Id:"*", InstallerVersion:"200", Compressed:"yes", Description:project.description, Manufacturer:project.organization.name)
      Media(Id:"1", Cabinet:"NPanday.cab", EmbedCab:"yes")

      UIRef(Id:"WixUI_FeatureTree")
      UIRef(Id:"WixUI_ErrorProgressText")

      WixVariable(Id:"WixUILicenseRtf", Value:"${project.basedir}\\src\\main\\wix\\License.rtf")

      PropertyRef(Id:"WIX_DIR_PROFILE")

      Property(Id:"VS2005INSTALLED") {
        RegistrySearch(Id:"VS2005INSTALLED", Root:"HKCR", Key:"VisualStudio.DTE.8.0", Type: "raw")
      }
      Property(Id:"VS2008INSTALLED") {
        RegistrySearch(Id:"VS2008INSTALLED", Root:"HKCR", Key:"VisualStudio.DTE.9.0", Type: "raw")
      }
      Property(Id:"VS2010INSTALLED") {
        RegistrySearch(Id:"VS2010INSTALLED", Root:"HKCR", Key:"VisualStudio.DTE.10.0", Type: "raw")
      }

      Condition(Message:"NPanday cannot be installed on Windows 9x/ME", "VersionNT")
      Condition(Message:"You need to be an administrator to install this product.", "AdminUser")


      // TODO: check .NET version -- see http://wix.sourceforge.net/manual-wix3/check_for_dotnet.htm
      //   need to decide on best approach here - require .NET 3.5 SP1 + Windows 6.0A SDK for VS2008 installation feature, and lower for the others?
      //   see related point below about detecting what is installed and installing selectively
      //   may want to allow choosing the features

      // TODO: check Java installed? HKLM\Software\JavaSoft\Java Development Kit\1.5

      // TODO: check Maven installed? env.M2_HOME and mvn in path

      Directory(Id:"TARGETDIR", Name:"SourceDir") {
        Directory(Id:"WIX_DIR_PROFILE") {
          Directory(Id:"M2",Name:".m2") {
            Directory(Id:"REPOSITORYDIR",Name:"repository") {
              traverse = { dir, id ->
                def files = []
                dir.eachFile { f ->
                  if ( f.isDirectory() ) {
                    nextId = id + "_" + f.name.replace('-','')
                    Directory(Id:"__dir" + nextId, Name:f.name) {
                      traverse( f, nextId )
                    }
                  }
                  else if ( ! ( f.name =~ /maven-metadata(-central)?.xml*/ ) ) {
                    files << f
                  }
                }
                if ( files ) {
                  def componentId = "repository" + id
                  repositoryComponentIds << componentId
                  Component(Id:componentId,Guid:generateGuid()) {
                    files.each { f ->
                      File(Name:f.name, DiskId:"1", Source:f.absolutePath)
                    }
                  }
                }
              }
              traverse(repositoryBasedir, "")
            }
            Directory(Id:"ProgramFilesFolder", Name:"PFiles") {
              Directory(Id:"NPandayDir", Name:"NPanday") {
                Directory(Id:"BinDir", Name:"bin") {
                  addinArtifacts.each { file ->
                    Component(Id:file.name, Guid:generateGuid()) {
                      // It doesn't appear to be necessary to put any of these in the GAC
                      //  otherwise we'd need to check the file name is in the list of GAC installs and set Assembly:'.net'
                      File(Name:file.name, DiskId:"1", Source:file.absolutePath)
                    }
                  }
                }
              }
            }
            Directory(Id:"PersonalFolder", Name:"MyDocuments") {
              visualStudioVersions.each { vs ->
                Directory(Id:"VS${vs}Folder", Name:"Visual Studio ${vs}") {
                  Directory(Id:"VS${vs}Addin", Name:"Addins") {
                    Component(Id:"VS${vs}AddinDescriptor", Guid:generateGuid()) {
                      RemoveFolder(Id:"remove_VS${vs}Addin",On:"uninstall")
                      RemoveFolder(Id:"remove_VS${vs}Folder",On:"uninstall",Directory:"VS${vs}Folder")
                      RegistryKey( Root:"HKCU", Key:"Software\\NPanday\\VS${vs}AddinDescriptor") {
                        RegistryValue( KeyPath: "yes", Type:"string", Value:"" )
                      }
                      File(Id:"VS${vs}_file", Name:"NPanday.VisualStudio.Addin", DiskId:"1",
                           Source:"${project.basedir}/src/main/wix/NPanday.VisualStudio.Addin")
                      'util:XmlFile'(Id:"VS${vs}XmlModifyAssembly", Action:"setValue",
                                     ElementPath:"/Extensibility/Addin/Assembly",
                                     File:"[VS${vs}Addin]NPanday.VisualStudio.Addin",
                                     Value:"[BinDir]NPanday.VisualStudio.Addin.dll")
                      'util:XmlFile'(Id:"VS${vs}XmlModifyDescription", Action:"setValue",
                                     ElementPath:"/Extensibility/Addin/Description",
                                     File:"[VS${vs}Addin]NPanday.VisualStudio.Addin",
                                     Value:"${project.description}")
                      'util:XmlFile'(Id:"VS${vs}XmlModifyFriendlyName", Action:"setValue",
                                     ElementPath:"/Extensibility/Addin/FriendlyName",
                                     File:"[VS${vs}Addin]NPanday.VisualStudio.Addin",
                                     Value:"NPanday ${pom.version} Maven in .NET Applications")
                    }
                  }
                }
              }
            }
          }
        }
      }
      Feature(Id:"NPandayRepository", Title:"NPanday Maven Repository", Level:"1",
              ConfigurableDirectory:'REPOSITORYDIR', AllowAdvertise:"no") {
        for ( id in repositoryComponentIds ) {
          ComponentRef(Id:id)
        }
      }
      Feature(Id:"NPandayAddIn", Title:"NPanday Visual Studio Add-in", Level: "1", Display: "expand",
              AllowAdvertise:"no") {
        addinArtifacts.each { file ->
          ComponentRef(Id:file.name)
        }
        visualStudioVersions.each { vs ->
          Feature(Id:"NPandayAddIn${vs}", Title:"NPanday Visual Studio Add-in for Visual Studio ${vs}", Level: "1",
                  AllowAdvertise:"no") {
            Condition(Level:"0", "NOT VS${vs}INSTALLED")
            ComponentRef(Id:"VS${vs}AddinDescriptor")
          }
        }
      }
    }
  }
}

