name: Release

on:
  push:
    branches:
      - main
    paths:
      - "src/**"
      - "packages/**"
      - ".github/workflows/**"
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}

jobs:
  changelog:
    runs-on: ubuntu-latest
    outputs:
      version: ${{ steps.changelog.outputs.version }}
      body: ${{ steps.changelog.outputs.clean_changelog }}
      tag: ${{ steps.changelog.outputs.tag }}
      skipped: ${{ steps.changelog.outputs.skipped }}
    steps:
      - name: Checkout code 👋
        uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
      - name: Create changelog ✍️
        id: changelog
        uses: TriPSs/conventional-changelog-action@ee43def3241429afddab215ba89090cbf64fb45c
        with:
          github-token: ${{ secrets.github_token }}
          skip-version-file: "true"
          output-file: "false"
          skip-commit: "true"
          skip-on-empty: "true"
          skip-tag: "true"

  android:
    needs: changelog
    if: ${{ needs.changelog.outputs.skipped == 'false' }}
    runs-on: ubuntu-latest
    container: ghcr.io/jandedobbeleer/golang-android-container:latest
    steps:
      - name: Checkout code 👋
        uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
      - name: Build 🏗
        run: |
          cd src
          go build -o dist/posh-android-arm -ldflags="-s -w -X 'github.com/jandedobbeleer/oh-my-posh/src/build.Version=${{ needs.changelog.outputs.version }}' -X 'github.com/jandedobbeleer/oh-my-posh/src/build.Date=$(date)'"
      - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
        with:
          name: android-artifact
          path: src/dist/posh-android-arm

  artifacts:
    needs: changelog
    if: ${{ needs.changelog.outputs.skipped == 'false' }}
    runs-on: windows-latest
    defaults:
      run:
        shell: pwsh
        working-directory: ${{ github.workspace }}/build
    steps:
      - name: Checkout code 👋
        uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
      - name: Install Go 🗳
        uses: ./.github/workflows/composite/bootstrap-go
      - name: Pre Build 😸
        env:
          SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
        run: |
          ./pre.ps1 -Version ${{ needs.changelog.outputs.version }} -SDKVersion "10.0.26100.0"
      - name: Run GoReleaser 🚀
        uses: goreleaser/goreleaser-action@f06c13b6b1a9625abc9e6e439d9c05a8f2190e94
        with:
          distribution: goreleaser
          version: v2.3.2
          args: release --clean --skip publish
          workdir: src
        env:
          AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
          AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
          AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
      - name: Package Go module dependencies 📦
        working-directory: ${{ github.workspace }}/src
        run: |
          $env:GOMODCACHE = Join-Path $env:RUNNER_TEMP "gomodcache"
          go mod download -modcacherw
          New-Item -ItemType Directory -Force -Path dist | Out-Null
          tar -acf "dist/oh-my-posh-${{ needs.changelog.outputs.version }}-deps.tar.xz" -C $env:RUNNER_TEMP gomodcache
      - name: Post Build 🤐
        run: |
          ./post.ps1
      - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
        with:
          name: build-artifacts
          path: |
            src/dist/posh-*
            src/dist/themes.*
            src/dist/checksums.*
            src/dist/*-deps.tar.xz
  msix:
    needs:
      - changelog
      - artifacts
    runs-on: windows-latest
    strategy:
      matrix:
        arch: [x64, arm64]
    defaults:
      run:
        shell: pwsh
        working-directory: ${{ github.workspace }}/packages/msix
    steps:
      - name: Checkout code 👋
        uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
      - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
        with:
          name: build-artifacts
          path: dist
      - name: Build installer 📦
        id: build
        env:
          AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
          AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
          AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
        run: |
          $version = '${{ needs.changelog.outputs.version }}'.TrimStart("v")
          ./build.ps1 -Architecture ${{ matrix.arch }}  -Version $version -Copy -Sign -SDKVersion "10.0.26100.0"
      - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
        with:
          name: msix-artifact-${{ matrix.arch }}
          path: |
            packages/msix/out/install-${{ matrix.arch }}.msix
  release:
    runs-on: ubuntu-latest
    needs:
      - changelog
      - artifacts
      - msix
      - android
    steps:
      - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
        with:
          merge-multiple: true
      - name: Upload version file
        env:
          AZURE_STORAGE_CONNECTION_STRING: ${{ secrets.CDN_CONNECTIONSTRING }}
        run: |
          echo v${{ needs.changelog.outputs.version }} > version.txt
          az storage blob upload-batch --destination releases/v${{ needs.changelog.outputs.version }} --source .
          az storage blob upload-batch --destination releases/latest --overwrite true --source .
      - name: Create draft release 📝
        uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228
        with:
          tag_name: ${{ needs.changelog.outputs.tag }}
          body: ${{ needs.changelog.outputs.body }}
          fail_on_unmatched_files: true
          draft: true
          token: ${{ secrets.GH_PAT }}
          files: |
            *
      - name: Publish release 🎓
        env:
          GH_TOKEN: ${{ secrets.GH_PAT }}
        run: gh release edit ${{ needs.changelog.outputs.tag }} --draft=false --repo ${{ github.repository }}
  winget:
    runs-on: windows-latest
    needs:
      - changelog
      - release
    env:
      WINGETCREATE_TOKEN: ${{ secrets.WINGETCREATE_TOKEN }}
    steps:
    - name: Create manifest and submit PR 📦
      shell: pwsh
      run: |
        Write-Host "Preparing to submit to WinGet repository..." -ForegroundColor Green

        # Install the latest wingetcreate exe
        # Need to do things this way, see https://github.com/PowerShell/PowerShell/issues/13138
        Write-Verbose "Importing Appx module using Windows PowerShell compatibility"
        Import-Module Appx -UseWindowsPowerShell -ErrorAction Stop

        # Download and install Winget-Create msixbundle
        $appxBundleFile = Join-Path -Path $env:TEMP -ChildPath "wingetcreate.msixbundle"
        Write-Verbose "Downloading wingetcreate to: $appxBundleFile"

        Invoke-WebRequest -Uri "https://aka.ms/wingetcreate/latest/msixbundle" -OutFile $appxBundleFile -ErrorAction Stop
        Add-AppxPackage -Path $appxBundleFile -ErrorAction Stop

        Write-Verbose "Successfully installed wingetcreate"

        # Submit the PR to WinGet repository
        Write-Host "Submitting pull request to WinGet repository..." -ForegroundColor Green

        $version = "${{ needs.changelog.outputs.tag }}"
        $version = $version.TrimStart('v')

        $urls = @(
            "https://github.com/JanDeDobbeleer/oh-my-posh/releases/download/v$version/install-x64.msix|x64",
            "https://github.com/JanDeDobbeleer/oh-my-posh/releases/download/v$version/install-arm64.msix|arm64"
        )

        wingetcreate update JanDeDobbeleer.OhMyPosh --version $version --token $env:WINGETCREATE_TOKEN --submit --urls $urls
