name: Release

on:
  push:
    tags:
      - "v*"
    branches:
      - dev

jobs:
  build:
    strategy:
      fail-fast: true
      matrix:
        goos: [linux, windows]
        goarch: [amd64]
        include:
          - goos: linux
            goarch: s390x
          - goos: linux
            goarch: arm64

    name: Build artifacts
    runs-on: ubuntu-latest
    container:
      image: goreleaser/goreleaser-cross:v1.23
    steps:
      - run: git config --global --add safe.directory /__w/nezha/nezha
      - uses: actions/checkout@v4

      - name: Fetch IPInfo GeoIP Database
        env:
          IPINFO_TOKEN: ${{ secrets.IPINFO_TOKEN }}
        run: |
          rm pkg/geoip/geoip.db
          wget -qO pkg/geoip/geoip.db https://ipinfo.io/data/free/country.mmdb?token=${IPINFO_TOKEN}

      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version: "1.23.x"

      - name: generate swagger docs
        run: |
          go install github.com/swaggo/swag/cmd/swag@latest
          swag init --pd -d . -g ./cmd/dashboard/main.go -o ./cmd/dashboard/docs --parseGoList=false

      - name: Build with tag
        if: contains(github.ref, 'refs/tags/')
        uses: goreleaser/goreleaser-action@v6
        env:
          GOOS: ${{ matrix.goos }}
          GOARCH: ${{ matrix.goarch }}
          GOARM: ${{ matrix.goarm }}
        with:
          distribution: goreleaser
          version: "~> v2"
          args: build --single-target --clean --skip=validate

      - name: Build snapshot
        if: contains(github.ref, 'refs/tags/') == false
        uses: goreleaser/goreleaser-action@v6
        env:
          GOOS: ${{ matrix.goos }}
          GOARCH: ${{ matrix.goarch }}
          GOARM: ${{ matrix.goarm }}
        with:
          distribution: goreleaser
          version: "~> v2"
          args: build --single-target --clean --skip=validate --snapshot

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: dashboard-${{ matrix.goos }}-${{ matrix.goarch }}
          path: |
            ./dist/*/*

  release:
    runs-on: ubuntu-latest
    if: github.event_name == 'push' && contains(github.ref, 'refs/tags/')
    needs: build
    name: Release
    steps:
      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          path: ./assets

      - name: Archive and compress binaries
        run: |
          find assets/*/*/* -type f | while read -r file; do
            dir=$(dirname "$file")
            filename=$(basename "$file")
            fileWithoutExt="${filename%.*}"
            zip -jr "$dir/$fileWithoutExt.zip" "$file"
          done

      - name: Release
        uses: ncipollo/release-action@v1
        with:
          artifacts: "assets/*/*/*.zip"
          generateReleaseNotes: true

      - name: Purge jsdelivr cache
        run: |
          curl -s https://purge.jsdelivr.net/gh/${{ github.repository_owner }}/nezha@master/script/install.sh
          curl -s https://purge.jsdelivr.net/gh/${{ github.repository_owner }}/nezha@master/script/nezha-agent.service
          curl -s https://purge.jsdelivr.net/gh/${{ github.repository_owner }}/nezha@master/script/docker-compose.yaml
          curl -s https://purge.jsdelivr.net/gh/${{ github.repository_owner }}/nezha@master/script/config.yaml
          LOWER_USERNAME=$(echo "${{ github.repository_owner }}" | tr '[:upper:]' '[:lower:]')
          curl -s https://purge.jsdelivr.net/gh/$LOWER_USERNAME/nezha@master/script/install.sh
          curl -s https://purge.jsdelivr.net/gh/$LOWER_USERNAME/nezha@master/script/nezha-agent.service
          curl -s https://purge.jsdelivr.net/gh/$LOWER_USERNAME/nezha@master/script/docker-compose.yaml
          curl -s https://purge.jsdelivr.net/gh/$LOWER_USERNAME/nezha@master/script/config.yaml

      - name: Trigger sync
        env:
          GH_REPO: ${{ github.repository }}
          GH_TOKEN: ${{ github.token }}
          GH_DEBUG: api
        run: |
          gh workflow run sync-release.yml

  release-docker:
    runs-on: ubuntu-latest
    if: github.event_name == 'push'
    needs: build
    name: Release Docker images
    steps:
      - uses: actions/checkout@v4

      - uses: robinraju/release-downloader@v1
        with:
          repository: nezhahq/admin-frontend
          tag: v1.0.3
          fileName: dist.zip
          latest: true
          extract: true

      - name: prepare admin-frontend dists
        run: |
          mv dist admin-dist

      - uses: robinraju/release-downloader@v1
        with:
          repository: nezhahq/user-frontend
          tag: v1.0.2
          fileName: dist.zip
          latest: true
          extract: true

      - name: prepare admin-frontend dists
        run: |
          mv dist user-dist

      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          path: ./assets

      - name: Fix permissions
        run: |
          chmod -R +x ./assets/*
          mkdir dist
          mv ./assets/*/*/* ./dist

      - name: Extract branch name in tag
        run: |
          if [[ $GITHUB_REF == refs/heads/* ]]; then
            export TAG_NAME=$(echo ${GITHUB_REF#refs/heads/})
          else
            export TAG_NAME=$(echo ${GITHUB_REF#refs/tags/})
          fi
          echo "tag=$TAG_NAME" >> $GITHUB_OUTPUT
        id: extract_branch

      - name: Log into GHCR
        uses: docker/login-action@master
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ github.token }}

      - name: Log in to the AliyunCS
        if: contains(github.ref, 'refs/tags/')
        uses: docker/login-action@master
        with:
          registry: registry.cn-shanghai.aliyuncs.com
          username: ${{ secrets.ALI_USER }}
          password: ${{ secrets.ALI_PAT }}

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Set up image name
        run: |
          GHCR_IMAGE_NAME=$(echo "ghcr.io/${{ github.repository_owner }}/nezha" | tr '[:upper:]' '[:lower:]')
          if [ ${{ github.repository_owner }} = "nezhahq" ]
            then ALI_IMAGE_NAME=$(echo "registry.cn-shanghai.aliyuncs.com/naibahq/nezha-dashboard")
            else ALI_IMAGE_NAME=$(echo "registry.cn-shanghai.aliyuncs.com/${{ github.repository_owner }}/nezha-dashboard" | tr '[:upper:]' '[:lower:]')
          fi
          echo "GHCR_IMAGE_NAME=$GHCR_IMAGE_NAME" >> $GITHUB_OUTPUT
          echo "ALI_IMAGE_NAME=$ALI_IMAGE_NAME" >> $GITHUB_OUTPUT
        id: image-name

      - name: Build dasbboard image And Push with tag
        if: contains(github.ref, 'refs/tags/')
        uses: docker/build-push-action@v5
        with:
          context: .
          file: ./Dockerfile
          platforms: linux/amd64,linux/arm64,linux/s390x
          push: true
          tags: |
            ${{ steps.image-name.outputs.GHCR_IMAGE_NAME }}:latest
            ${{ steps.image-name.outputs.GHCR_IMAGE_NAME }}:${{ steps.extract_branch.outputs.tag }}
            ${{ steps.image-name.outputs.ALI_IMAGE_NAME }}:latest
            ${{ steps.image-name.outputs.ALI_IMAGE_NAME }}:${{ steps.extract_branch.outputs.tag }}

      - name: Build dasbboard image And Push snapshot
        if: contains(github.ref, 'refs/tags/') == false
        uses: docker/build-push-action@v5
        with:
          context: .
          file: ./Dockerfile
          platforms: linux/amd64,linux/arm64,linux/s390x
          push: true
          tags: |
            ${{ steps.image-name.outputs.GHCR_IMAGE_NAME }}:${{ steps.extract_branch.outputs.tag }}