# Adapted from https://github.com/rust-lang/rustup/blob/master/.github/workflows/windows-builds-on-master.yaml

name: Windows

on:
  pull_request:
    branches:
      - "*"
  push:
    branches:
      - master
      - feature/*
      - hotfix/*
    tags:
      - v*
  schedule:
    - cron: "30 0 * * 0" # Every day at 00:30 UTC
  workflow_dispatch:

jobs:
  cargo-deny:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - uses: EmbarkStudios/cargo-deny-action@v2

  build:
    strategy:
      fail-fast: true
      matrix:
        platform:
          - os-name: Windows-x86_64
            runs-on: windows-latest
            target: x86_64-pc-windows-msvc
          - os-name: Windows-aarch64
            runs-on: windows-latest
            target: aarch64-pc-windows-msvc
    runs-on: ${{ matrix.platform.runs-on }}
    permissions: write-all
    env:
      RUSTFLAGS: -Ctarget-feature=+crt-static -Dwarnings
      GH_TOKEN: ${{ github.token }}
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - run: rustup toolchain install stable --profile minimal
      - run: rustup component add --toolchain stable-x86_64-pc-windows-msvc clippy
      - run: rustup toolchain install nightly --allow-downgrade -c rustfmt
      - uses: Swatinem/rust-cache@v2
        with:
          cache-on-failure: "true"
          cache-all-crates: "true"
          key: ${{ matrix.platform.target }}
      - run: cargo +nightly fmt --check
      - run: cargo clippy
      - run: cargo test
      - uses: houseabsolute/actions-rust-cross@v1
        with:
          command: "build"
          target: ${{ matrix.platform.target }}
          args: "--locked --release"
      - run: |
          cargo install cargo-wix
          cargo wix --no-build -p komorebi --nocapture -I .\wix\main.wxs --target ${{ matrix.platform.target }}
      - uses: actions/upload-artifact@v7
        with:
          name: komorebi-${{ matrix.platform.target }}-${{ github.sha }}
          path: |
            target/${{ matrix.platform.target }}/release/*.exe
            target/${{ matrix.platform.target }}/release/*.pdb
            target/wix/komorebi-*.msi
          retention-days: 14

  nightly:
    needs: build
    runs-on: windows-latest
    permissions: write-all
    if: ${{ github.ref == 'refs/heads/master' && (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' ) }}
    env:
      GH_TOKEN: ${{ github.token }}
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - shell: bash
        run: echo "VERSION=nightly" >> $GITHUB_ENV
      - uses: actions/download-artifact@v8
      - run: |
          Compress-Archive -Force ./komorebi-x86_64-pc-windows-msvc-${{ github.sha }}/x86_64-pc-windows-msvc/release/*.exe komorebi-$Env:VERSION-x86_64-pc-windows-msvc.zip
          Copy-Item ./komorebi-x86_64-pc-windows-msvc-${{ github.sha }}/wix/*x86_64.msi -Destination ./komorebi-$Env:VERSION-x86_64.msi
          echo "$((Get-FileHash komorebi-$Env:VERSION-x86_64-pc-windows-msvc.zip).Hash.ToLower())  komorebi-$Env:VERSION-x86_64-pc-windows-msvc.zip" >checksums.txt

          Compress-Archive -Force ./komorebi-aarch64-pc-windows-msvc-${{ github.sha }}/aarch64-pc-windows-msvc/release/*.exe komorebi-$Env:VERSION-aarch64-pc-windows-msvc.zip
          Copy-Item ./komorebi-aarch64-pc-windows-msvc-${{ github.sha }}/wix/*aarch64.msi -Destination ./komorebi-$Env:VERSION-aarch64.msi
          echo "$((Get-FileHash komorebi-$Env:VERSION-aarch64-pc-windows-msvc.zip).Hash.ToLower())  komorebi-$Env:VERSION-aarch64-pc-windows-msvc.zip" >>checksums.txt
      - uses: Swatinem/rust-cache@v2
        with:
          cache-on-failure: "true"
          cache-all-crates: "true"
      - shell: bash
        run: |
          if ! type kokai >/dev/null; then cargo install --locked kokai --force; fi
          git tag -d nightly || true
          git tag nightly
          kokai release --no-emoji --add-links github:commits,issues --ref nightly >"CHANGELOG.md"
      - shell: bash
        run: |
          gh release delete nightly --yes || true
          git push origin :nightly || true
          gh release create nightly \
            --target $GITHUB_SHA \
            --prerelease \
            --title "komorebi nightly (${GITHUB_SHA})" \
            --notes-file CHANGELOG.md \
            komorebi-nightly-x86_64-pc-windows-msvc.zip \
            komorebi-nightly-x86_64.msi \
            komorebi-nightly-aarch64-pc-windows-msvc.zip \
            komorebi-nightly-aarch64.msi \
            checksums.txt

  release-dry-run:
    needs: build
    runs-on: windows-latest
    permissions: write-all
    if: ${{ github.ref == 'refs/heads/master' }}
    env:
      GH_TOKEN: ${{ github.token }}
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - shell: bash
        run: |
          TAG=${{ github.event.release.tag_name }}
          echo "VERSION=${TAG#v}" >> $GITHUB_ENV
      - uses: actions/download-artifact@v8
      - run: |
          Compress-Archive -Force ./komorebi-x86_64-pc-windows-msvc-${{ github.sha }}/x86_64-pc-windows-msvc/release/*.exe komorebi-$Env:VERSION-x86_64-pc-windows-msvc.zip
          Copy-Item ./komorebi-x86_64-pc-windows-msvc-${{ github.sha }}/wix/*x86_64.msi -Destination ./komorebi-$Env:VERSION-x86_64.msi
          echo "$((Get-FileHash komorebi-$Env:VERSION-x86_64-pc-windows-msvc.zip).Hash.ToLower())  komorebi-$Env:VERSION-x86_64-pc-windows-msvc.zip" >checksums.txt

          Compress-Archive -Force ./komorebi-aarch64-pc-windows-msvc-${{ github.sha }}/aarch64-pc-windows-msvc/release/*.exe komorebi-$Env:VERSION-aarch64-pc-windows-msvc.zip
          Copy-Item ./komorebi-aarch64-pc-windows-msvc-${{ github.sha }}/wix/*aarch64.msi -Destination ./komorebi-$Env:VERSION-aarch64.msi
          echo "$((Get-FileHash komorebi-$Env:VERSION-aarch64-pc-windows-msvc.zip).Hash.ToLower())  komorebi-$Env:VERSION-aarch64-pc-windows-msvc.zip" >>checksums.txt
      - uses: Swatinem/rust-cache@v2
        with:
          cache-on-failure: "true"
          cache-all-crates: "true"
      - shell: bash
        run: |
          if ! type kokai >/dev/null; then cargo install --locked kokai --force; fi
          git tag -d nightly || true
          kokai release --no-emoji --add-links github:commits,issues --ref "${{ github.ref_name }}" >"CHANGELOG.md"
      - uses: softprops/action-gh-release@v2
        with:
          draft: true
          body_path: "CHANGELOG.md"
          files: |
            checksums.txt
            *.zip
            *.msi

  release:
    needs: build
    runs-on: windows-latest
    permissions: write-all
    if: startsWith(github.ref, 'refs/tags/v')
    env:
      GH_TOKEN: ${{ github.token }}
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - shell: bash
        run: |
          TAG=${{ github.ref_name }}
          echo "VERSION=${TAG#v}" >> $GITHUB_ENV
      - uses: actions/download-artifact@v8
      - run: |
          Compress-Archive -Force ./komorebi-x86_64-pc-windows-msvc-${{ github.sha }}/x86_64-pc-windows-msvc/release/*.exe komorebi-$Env:VERSION-x86_64-pc-windows-msvc.zip
          Copy-Item ./komorebi-x86_64-pc-windows-msvc-${{ github.sha }}/wix/*x86_64.msi -Destination ./komorebi-$Env:VERSION-x86_64.msi
          echo "$((Get-FileHash komorebi-$Env:VERSION-x86_64-pc-windows-msvc.zip).Hash.ToLower())  komorebi-$Env:VERSION-x86_64-pc-windows-msvc.zip" >checksums.txt

          Compress-Archive -Force ./komorebi-aarch64-pc-windows-msvc-${{ github.sha }}/aarch64-pc-windows-msvc/release/*.exe komorebi-$Env:VERSION-aarch64-pc-windows-msvc.zip
          Copy-Item ./komorebi-aarch64-pc-windows-msvc-${{ github.sha }}/wix/*aarch64.msi -Destination ./komorebi-$Env:VERSION-aarch64.msi
          echo "$((Get-FileHash komorebi-$Env:VERSION-aarch64-pc-windows-msvc.zip).Hash.ToLower())  komorebi-$Env:VERSION-aarch64-pc-windows-msvc.zip" >>checksums.txt
      - uses: Swatinem/rust-cache@v2
        with:
          cache-on-failure: "true"
          cache-all-crates: "true"
      - shell: bash
        run: |
          if ! type kokai >/dev/null; then cargo install --locked kokai --force; fi
          git tag -d nightly || true
          kokai release --no-emoji --add-links github:commits,issues --ref "$(git tag --points-at HEAD)" >"CHANGELOG.md"
      - uses: softprops/action-gh-release@v2
        with:
          body_path: "CHANGELOG.md"
          files: |
            checksums.txt
            *.zip
            *.msi

  winget:
    runs-on: ubuntu-latest
    needs: release
    if: startsWith(github.ref, 'refs/tags/v')
    steps:
      - uses: vedantmgoyal2009/winget-releaser@main
        with:
          identifier: LGUG2Z.komorebi
          token: ${{ secrets.WINGET_TOKEN }}
