on:
  workflow_dispatch:
  push:
    branches:
    - main
    paths:
    - 'configure'
    - 'm4/version.m4'
    - '.github/workflows/windows-release.yml'
  pull_request:
    branches:
    - main
    paths:
    - '.github/workflows/windows-release.yml'

name: windows release
jobs:
  change_log:
    name: 'Create ChangeLog.md'
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v4
      with:
        fetch-depth: 0

    - name: Install dependencies
      run: npm install -g auto-changelog

    - name: Create ChangeLog.md
      run: |
        export NEXT_VERSION=$(grep -oP "PACKAGE_VERSION='\K[0-9\.-]*" configure)
        git tag $NEXT_VERSION
        auto-changelog --sort-commits date
        mkdir artifacts
        mv ChangeLog.md artifacts/ChangeLog.md

    - name: Upload ChangeLog.md
      uses: actions/upload-artifact@v4
      with:
        name: ChangeLog
        path: artifacts

  release_windows_installer:
    name: 'Windows ${{matrix.quantum}}${{matrix.hdri_flag}}-${{matrix.platform}} (${{matrix.type}})'
    needs:
      - change_log
    runs-on: windows-2022

    permissions:
      id-token: write
      contents: read

    strategy:
      fail-fast: false
      matrix:
        platform: [ x64, x86 ]
        type: [ dll, static ]
        quantum: [ Q8, Q16 ]
        hdri: [ HDRI, noHDRI ]
        exclude:
          - quantum: Q8
            hdri: HDRI
        include:
          - platform: x64
            bit: 64
          - platform: x86
            bit: 32
          - type: dll
            type_flag: dmt
          - type: static
            type_flag: smtd
          - hdri: HDRI
            hdri_flag: '-HDRI'

    steps:
    - uses: actions/checkout@v4
      with:
        repository: ImageMagick/ImageMagick-Windows
        path: ImageMagick-Windows
        ref: refs/heads/main

    - name: Clone repositories
      shell: cmd
      run: |
        cd ImageMagick-Windows
        CloneRepositories.IM6.cmd

    - name: Download ChangeLog.md
      uses: actions/download-artifact@v4
      with:
        name: ChangeLog
        path: ImageMagick-Windows\ImageMagick

    - name: Install Strawberry Perl
      if: ${{matrix.type == 'dll'}}
      shell: cmd
      run: |
        powershell Invoke-WebRequest -Uri https://github.com/ImageMagick/ImageMagick-Windows/releases/download/20200615/strawberry-perl-5.30.2.1-${{matrix.bit}}bit.msi -OutFile strawberry-perl-5.30.2.1-${{matrix.bit}}bit.msi
        msiexec /i strawberry-perl-5.30.2.1-${{matrix.bit}}bit.msi /qn INSTALLDIR="C:\Strawberry${{matrix.bit}}"
        mv "C:\Strawberry" "C:\Strawberry64"

    - name: Install Inno Setup
      shell: cmd
      run: |
        powershell Invoke-WebRequest -Uri https://github.com/ImageMagick/ImageMagick-Windows/releases/download/20200615/innosetup-6.2.0.exe -OutFile innosetup-6.2.0.exe
        innosetup-6.2.0.exe /SILENT /SUPPRESSMSGBOXES /NORESTART /SP-

    - name: Build configure
      shell: cmd
      run: |
        call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat"
        cd ImageMagick-Windows\Configure
        msbuild Configure.sln /m /t:Rebuild /p:Configuration=Release,Platform=x64

    - name: Configure ImageMagick
      shell: cmd
      run: |
        cd ImageMagick-Windows\Configure
        Configure.exe /noWizard /VS2022 /includeOptional /installedSupport /deprecated /${{matrix.hdri}} /${{matrix.quantum}} /${{matrix.platform}} /${{matrix.type_flag}}

    - name: Build ImageMagick
      shell: cmd
      run: |
        call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat"
        cd ImageMagick-Windows
        msbuild /m /t:Rebuild /p:Configuration=Release,Platform=${{matrix.platform}}

    - name: Build PerlMagick
      if: ${{matrix.type == 'dll'}}
      shell: cmd
      run: |
        set PATH=
        call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat"
        cd ImageMagick-Windows\ImageMagick\PerlMagick
        set PATH=%PATH%;C:\Strawberry${{matrix.bit}}\c\bin;C:\Strawberry${{matrix.bit}}\perl\site\bin;C:\Strawberry${{matrix.bit}}\perl\bin;C:\WINDOWS\System32\WindowsPowerShell\v1.0
        perl "Makefile.PL" "MAKE=nmake"
        nmake
        nmake release

    - name: 'Azure CLI login with federated credential'
      if: github.event_name != 'pull_request'
      uses: azure/login@v2
      with:
        client-id: ${{ secrets.AZURE_CLIENT_ID }}
        tenant-id: ${{ secrets.AZURE_TENANT_ID }}
        subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

    - name: Sign binaries
      if: github.event_name != 'pull_request'
      uses: azure/trusted-signing-action@v0.5.1
      with:
        endpoint: https://eus.codesigning.azure.net/
        trusted-signing-account-name: ImageMagick
        certificate-profile-name: ImageMagick
        files-folder: 'ImageMagick-Windows\Artifacts\bin'
        files-folder-filter: dll,exe
        append-signature: true
        timeout: 600

    - name: Create installer
      shell: cmd
      run: |
        call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat"
        "C:\Program Files (x86)\Inno Setup 6\iscc.exe" ImageMagick-Windows\Installer\Inno\ImageMagick.iss

    - name: Sign installer
      if: github.event_name != 'pull_request'
      uses: azure/trusted-signing-action@v0.5.1
      with:
        endpoint: https://eus.codesigning.azure.net/
        trusted-signing-account-name: ImageMagick
        certificate-profile-name: ImageMagick
        files-folder: 'ImageMagick-Windows\Installer\Inno\Artifacts'
        files-folder-filter: dll,exe
        append-signature: true
        timeout: 600

    - name: Get version
      id: version
      shell: pwsh
      run: |
        $version = (cat "ImageMagick-Windows\Installer\Inno\config.isx" | Select-String "MagickPackageFullVersionText") | Out-String
        $version = ($version | Select-String '".*"' -AllMatches |  Select -Expand Matches | Select -Expand Value | Out-String)
        $version = $version -Replace "`n|`r|""",""
        $version = $version -Replace " ","-"
        echo "version=$version" >> $env:GITHUB_OUTPUT

    - uses: actions/upload-artifact@v4
      with:
        name: 'ImageMagick-${{steps.version.outputs.version}}-${{matrix.quantum}}${{matrix.hdri_flag}}-${{matrix.type}}-${{matrix.platform}}'
        path: 'ImageMagick-Windows\Installer\Inno\Artifacts'

  release_windows_source:
    name: 'Windows source'
    needs:
      - change_log
    runs-on: windows-latest

    steps:
    - uses: actions/checkout@v4
      with:
        repository: ImageMagick/ImageMagick-Windows
        path: ImageMagick-Windows
        ref: refs/heads/main

    - name: Clone repositories
      shell: cmd
      run: |
        cd ImageMagick-Windows
        CloneRepositories.IM6.cmd

    - name: Download ChangeLog.md
      uses: actions/download-artifact@v4
      with:
        name: ChangeLog
        path: ImageMagick-Windows\ImageMagick

    - name: Create source archive
      shell: cmd
      run: |
        cd ImageMagick-Windows
        mkdir Source
        move Build Source
        move Configure Source
        move Dependencies Source
        move ImageMagick Source
        move OptionalDependencies Source
        move Artifacts Source
        move Projects Source
        7z a ImageMagick6-Windows.7z .\Source\*

    - uses: actions/upload-artifact@v4
      with:
        name: ImageMagick6-Windows
        path: 'ImageMagick-Windows\ImageMagick6-Windows.7z'

  release_windows_portable:
    name: 'Windows portable ${{matrix.quantum}}${{matrix.hdri_flag}}-${{matrix.platform}}'
    needs:
      - change_log
    runs-on: windows-2022

    permissions:
      id-token: write
      contents: read

    strategy:
      fail-fast: false
      matrix:
        platform: [ x64, x86 ]
        quantum: [ Q8, Q16 ]
        hdri: [ HDRI, noHDRI ]
        exclude:
          - quantum: Q8
            hdri: HDRI
        include:
          - platform: x64
            bit: 64
          - platform: x86
            bit: 32
          - hdri: HDRI
            hdri_flag: '-HDRI'

    steps:
    - uses: actions/checkout@v4
      with:
        repository: ImageMagick/ImageMagick-Windows
        path: ImageMagick-Windows
        ref: refs/heads/main

    - name: Clone repositories
      shell: cmd
      run: |
        cd ImageMagick-Windows
        CloneRepositories.IM6.cmd

    - name: Download ChangeLog.md
      uses: actions/download-artifact@v4
      with:
        name: ChangeLog
        path: ImageMagick-Windows\ImageMagick

    - name: Build configure
      shell: cmd
      run: |
        call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat"
        cd ImageMagick-Windows\Configure
        msbuild Configure.sln /m /t:Rebuild /p:Configuration=Release,Platform=x64

    - name: Configure ImageMagick
      shell: cmd
      run: |
        cd ImageMagick-Windows\Configure
        Configure.exe /noWizard /VS2022 /${{matrix.hdri}} /${{matrix.quantum}} /${{matrix.platform}} /smt

    - name: Build ImageMagick
      shell: cmd
      run: |
        call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat"
        cd ImageMagick-Windows
        msbuild /m /t:Rebuild /p:Configuration=Release,Platform=${{matrix.platform}}

    - name: 'Azure CLI login with federated credential'
      if: github.event_name != 'pull_request'
      uses: azure/login@v2
      with:
        client-id: ${{ secrets.AZURE_CLIENT_ID }}
        tenant-id: ${{ secrets.AZURE_TENANT_ID }}
        subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

    - name: Sign executables
      if: github.event_name != 'pull_request'
      uses: azure/trusted-signing-action@v0.5.1
      with:
        endpoint: https://eus.codesigning.azure.net/
        trusted-signing-account-name: ImageMagick
        certificate-profile-name: ImageMagick
        files-folder: 'ImageMagick-Windows\Artifacts\bin'
        files-folder-filter: exe
        append-signature: true
        timeout: 600

    - name: Copy Files
      id: package
      shell: pwsh
      run: |
        [void](New-Item -Name "portable" -ItemType directory)
        Copy-Item "ImageMagick-Windows\Artifacts\bin\*.exe" "portable"
        Copy-Item "ImageMagick-Windows\Artifacts\bin\*.xml" "portable"
        Copy-Item "ImageMagick-Windows\Artifacts\bin\sRGB.icc" "portable"

        Copy-Item "ImageMagick-Windows\Artifacts\NOTICE.txt" "portable"
        Copy-Item "ImageMagick-Windows\ImageMagick\ChangeLog.md" "portable"
        Copy-Item "ImageMagick-Windows\ImageMagick\README.txt" "portable"
        Copy-Item "ImageMagick-Windows\ImageMagick\LICENSE" "portable\LICENSE.txt"

        $version = (cat "ImageMagick-Windows\Installer\Inno\config.isx" | Select-String "MagickPackageFullVersionText") | Out-String
        $version = ($version | Select-String '".*"' -AllMatches |  Select -Expand Matches | Select -Expand Value | Out-String)
        $version = $version -Replace "`n|`r|""",""
        $version = $version -Replace " ","-"
        echo "version=$version" >> $env:GITHUB_OUTPUT

    - uses: actions/upload-artifact@v4
      with:
        name: 'ImageMagick-${{steps.package.outputs.version}}-portable-${{matrix.quantum}}${{matrix.hdri_flag}}-${{matrix.platform}}'
        path: portable
