# Release (GitHub) — pipeline release primaria
#
# Triggerata quando un tag v* viene propagato dal mirror Gitea.
# Costruisce gli artifact per tutte le architetture e crea la GitHub Release.

name: Release

on:
  push:
    tags: ['v*']
  workflow_dispatch:
    inputs:
      tag:
        description: 'Tag versione (es. v1.7.0)'
        required: true

permissions:
  contents: write

jobs:
  build:
    runs-on: windows-latest
    strategy:
      fail-fast: true
      matrix:
        config: [x86-ansi, x86-unicode, x64-unicode]
    steps:
      - uses: actions/checkout@v6
        with:
          submodules: recursive

      - uses: actions/setup-python@v6
        with:
          python-version: '3.11'

      - uses: microsoft/setup-msbuild@v3

      - name: Build ${{ matrix.config }}
        run: python build_plugin.py --config ${{ matrix.config }}

      - name: Determine version & arch
        id: meta
        shell: pwsh
        run: |
          $tag = "${{ github.ref_name }}"
          if ([string]::IsNullOrEmpty($tag) -or $tag -eq "main") { $tag = "${{ inputs.tag }}" }
          $v = $tag -replace '^v',''
          $map = @{ 'x86-ansi' = 'x86-ansi'; 'x86-unicode' = 'x86-unicode'; 'x64-unicode' = 'amd64-unicode' }
          $dir = $map['${{ matrix.config }}']
          echo "version=$v" >> $env:GITHUB_OUTPUT
          echo "tag=$tag"   >> $env:GITHUB_OUTPUT
          echo "dir=$dir"   >> $env:GITHUB_OUTPUT

      - name: Package
        shell: pwsh
        run: |
          $name = "${{ github.event.repository.name }}-${{ steps.meta.outputs.version }}-${{ steps.meta.outputs.dir }}"
          $stage = "stage/$name"
          New-Item -ItemType Directory -Force -Path $stage | Out-Null
          Copy-Item "dist/${{ steps.meta.outputs.dir }}/*" $stage -Recurse
          Copy-Item README.md, LICENSE, VERSION, CHANGELOG.md $stage
          if (Test-Path "include")  { Copy-Item "include"  $stage -Recurse }
          if (Test-Path "examples") { Copy-Item "examples" $stage -Recurse }
          Compress-Archive -Path "$stage/*" -DestinationPath "$name.zip" -Force

      - uses: actions/upload-artifact@v7
        with:
          name: pkg-${{ matrix.config }}
          path: '*.zip'

  build-linux:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: true
      matrix:
        config: [x86-ansi, x86-unicode, x64-unicode]
    steps:
      - uses: actions/checkout@v6
        with:
          submodules: recursive

      - uses: actions/setup-python@v6
        with:
          python-version: '3.11'

      - name: Install MinGW toolchain
        run: |
          sudo apt-get update
          sudo apt-get install -y \
            make \
            binutils-mingw-w64-i686 \
            binutils-mingw-w64-x86-64 \
            g++-mingw-w64-i686 \
            g++-mingw-w64-x86-64

      - name: Build ${{ matrix.config }} on Linux
        run: python build_plugin.py --host linux --configs ${{ matrix.config }}

      - name: Collect DLL
        run: |
          case "${{ matrix.config }}" in
            x86-ansi) dir="x86-ansi" ;;
            x86-unicode) dir="x86-unicode" ;;
            x64-unicode) dir="amd64-unicode" ;;
          esac
          dst="dist/${{ matrix.config }}"
          mkdir -p "$dst"
          cp "plugins/$dir/nsis7z.dll" "$dst/"

      - uses: actions/upload-artifact@v7
        with:
          name: linux-build-${{ matrix.config }}
          path: dist/**
          if-no-files-found: error

  publish:
    needs: [build, build-linux]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - uses: actions/download-artifact@v8
        with:
          path: artifacts
          merge-multiple: true

      - name: Extract changelog section
        run: |
          tag="${{ github.ref_name }}"
          version="${tag#v}"
          awk -v ver="[$version]" '
            /^## / && index($0, ver) { found=1; next }
            found && /^## / { exit }
            found { print }
          ' CHANGELOG.md > release_body.md
          # Append Gitea notice
          echo "" >> release_body.md
          echo "---" >> release_body.md
          echo "_Repository primario: vedi link Gitea nel README. Il mirror GitHub è generato automaticamente._" >> release_body.md

      - name: SHA256SUMS
        run: |
          cd artifacts
          sha256sum *.zip > SHA256SUMS.txt
          cat SHA256SUMS.txt

      - name: Create GitHub Release
        uses: softprops/action-gh-release@v3
        with:
          files: |
            artifacts/*.zip
            artifacts/SHA256SUMS.txt
          body_path: release_body.md

      - name: Update Gitea Release body
        env:
          GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
        run: |
          python3 - <<'PY'
          import sys
          import json
          import os
          import urllib.error
          import urllib.request

          base = "https://gitea.emulab.it/api/v1"
          repo = "Simone/nsis-plugin-ns7zip"
          tag = "${{ github.ref_name }}"
          token = os.environ["GITEA_TOKEN"]

          with open("release_body.md", "r", encoding="utf-8") as f:
            body = f.read()

          def request(method, path, payload=None):
            data = json.dumps(payload).encode("utf-8") if payload is not None else None
            req = urllib.request.Request(
              f"{base}{path}",
              data=data,
              method=method,
              headers={
                "Authorization": f"token {token}",
                "Content-Type": "application/json",
                "Accept": "application/json",
              },
            )
            with urllib.request.urlopen(req) as resp:
              return json.loads(resp.read().decode("utf-8"))

          try:
            try:
              release = request("GET", f"/repos/{repo}/releases/tags/{tag}")
              rid = release["id"]
              request("PATCH", f"/repos/{repo}/releases/{rid}", {"body": body})
              print(f"Updated existing Gitea release id={rid} for tag {tag}")
            except urllib.error.HTTPError as e:
              if e.code == 404:
                created = request(
                  "POST",
                  f"/repos/{repo}/releases",
                  {
                    "tag_name": tag,
                    "name": tag,
                    "body": body,
                    "draft": False,
                    "prerelease": False,
                  },
                )
                print(f"Created Gitea release id={created['id']} for tag {tag}")
              elif e.code in (401, 403):
                print("::warning::Gitea release sync skipped: token unauthorized/forbidden. Check GITEA_TOKEN permissions (Repository Read+Write).")
                sys.exit(0)
              else:
                raise
          except urllib.error.HTTPError as e:
            print(f"::warning::Gitea release sync skipped due to HTTP {e.code}: {e.reason}")
            sys.exit(0)
          PY
