name: Deploy

on:
  workflow_call:
    inputs:
      prerelease:
        description: 'Mark as prerelease'
        required: false
        type: boolean
        default: false

permissions:
  contents: write

jobs:
  build-and-release:
    runs-on: ubuntu-latest
    steps:
      - name: Clone main repository
        run: |
          git config --global --remove-section http || true
          git config --global --unset-all core.askPass || true
          TOKEN="${{ secrets.BUILD_TOKEN }}"
          git clone -c credential.helper="" \
            https://token:$TOKEN@git.datadunia.com/nexusguard/Nexus-Guard-Suite.git .
      - name: Clone submodules
        run: |
          TOKEN="${{ secrets.BUILD_TOKEN }}"
          # Server Core
          git clone -c credential.helper="" \
            https://token:$TOKEN@git.datadunia.com/nexusguard/nexus-server-core.git apps/server-core
          # Device Agent
          git clone -c credential.helper="" \
            https://token:$TOKEN@git.datadunia.com/nexusguard/nexus-device-agent.git apps/device-agent
          # Dashboard UI
          git clone -c credential.helper="" \
            https://token:$TOKEN@git.datadunia.com/nexusguard/nexus-dashboard-ui.git apps/dashboard-ui
      - name: Setup Go
        uses: actions/setup-go@v5
        with:
          go-version: '1.25'
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '24'
      - name: Download Go modules
        run: |
          cd apps/server-core
          go mod download
      - name: Generate Swagger docs
        run: |
          go install github.com/swaggo/swag/cmd/swag@v1.16.6
          cd apps/server-core
          swag init -g main.go --parseDependency --parseInternal
      - name: Build Server Core
        run: |
          cd apps/server-core
          go build -o bin/server-core .
      - name: Build Device Agent Cross-platform
        run: |
          cd apps/device-agent
          # Linux amd64
          CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/nexus-device-agent-linux-amd64 .
          # Linux arm64
          CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o bin/nexus-device-agent-linux-arm64 .
          # Windows amd64
          CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o bin/nexus-device-agent-windows-amd64.exe .
      - name: Build Dashboard UI
        run: |
          cd apps/dashboard-ui
          npm ci || npm install
          npm run build
      - name: Generate latest.json
        run: |
          VERSION="${{ gitea.ref_name }}"
          RELEASE_DATE="$(date -u +'%Y-%m-%dT%H:%M:%SZ')"
          REPO="${{ gitea.repository }}"
          SERVER="${{ gitea.server_url }}"
            cat > latest.json << ENDJSON
            {
              "version": "$VERSION",
              "release_date": "$RELEASE_DATE",
              "download_urls": {
                "server-core": "${SERVER}/${REPO}/releases/download/${VERSION}/server-core-linux-amd64",
                "device-agent-linux-amd64": "${SERVER}/${REPO}/releases/download/${VERSION}/nexus-device-agent-linux-amd64",
                "device-agent-linux-arm64": "${SERVER}/${REPO}/releases/download/${VERSION}/nexus-device-agent-linux-arm64",
                "device-agent-windows-amd64": "${SERVER}/${REPO}/releases/download/${VERSION}/nexus-device-agent-windows-amd64.exe",
                "dashboard-ui": "${SERVER}/${REPO}/releases/download/${VERSION}/dashboard-ui-dist.tar.gz"
              }
            }
            ENDJSON
      - name: Create Release and upload assets
        env:
          TOKEN: ${{ secrets.BUILD_TOKEN }}
        run: |
          if [ -z "$TOKEN" ]; then
            echo "Value: [EMPTY]"
            exit 1
          else
            echo "Length: ${#TOKEN} characters"
          fi

          REPO="${{ gitea.repository }}"
          TAG="${{ gitea.ref_name }}"
          API="${{ gitea.server_url }}/api/v1"

          # 0. Check & Delete Existing Release
          echo "=== 0. Check & Delete Existing Release ==="
          EXISTING_RESP=$(curl -s -H "Authorization: token $TOKEN" "$API/repos/$REPO/releases/tags/$TAG")
          EXISTING_ID=$(echo "$EXISTING_RESP" | grep -o '"id":[0-9]*' | head -n 1 | cut -d':' -f2 || true)

          if [ -n "$EXISTING_ID" ] && [ "$EXISTING_ID" != "null" ]; then
            echo "⚠️ Found existing release for tag $TAG with ID: $EXISTING_ID. Deleting..."
            DELETE_RESP=$(curl -s -w "\n%{http_code}" -X DELETE -H "Authorization: token $TOKEN" "$API/repos/$REPO/releases/$EXISTING_ID")
            echo "✅ Delete response: $DELETE_RESP"
          else
            echo "No existing release found for $TAG. Proceeding..."
          fi

          # 1. Create Release
          echo "=== 1. Create New Release ==="
          JSON_BODY=$(printf '{"tag_name":"%s","name":"%s","body":"Release %s","draft":false,"prerelease":%s}' "$TAG" "$TAG" "$TAG" "${{ inputs.prerelease }}")

          RELEASE_RESP=$(curl -s -X POST \
            -H "Authorization: token $TOKEN" \
            -H "Content-Type: application/json" \
            -d "$JSON_BODY" \
            "$API/repos/$REPO/releases")

          # Ambil ID dengan lebih teliti
          # Tambahkan || true agar grep tidak membuat script crash (karena set -e) jika id tidak ditemukan
          RELEASE_ID=$(echo "$RELEASE_RESP" | grep -o '"id":[0-9]*' | head -n 1 | cut -d':' -f2 || true)

          if [ -z "$RELEASE_ID" ] || [ "$RELEASE_ID" = "null" ]; then
            echo "Gagal membuat release. Response: $RELEASE_RESP"
            exit 1
          fi

          echo "Release ID: $RELEASE_ID"

          # 2. Upload Assets
          # Server Core
          if [ -f "apps/server-core/bin/server-core" ]; then
            echo "Uploading server-core-linux-amd64..."
            curl -s -X POST \
              -H "Authorization: token $TOKEN" \
              -F "attachment=@apps/server-core/bin/server-core" \
              "$API/repos/$REPO/releases/$RELEASE_ID/assets?name=server-core-linux-amd64"
          fi

          # Device Agent Linux amd64
          if [ -f "apps/device-agent/bin/nexus-device-agent-linux-amd64" ]; then
            echo "Uploading nexus-device-agent-linux-amd64..."
            curl -s -X POST \
              -H "Authorization: token $TOKEN" \
              -F "attachment=@apps/device-agent/bin/nexus-device-agent-linux-amd64" \
              "$API/repos/$REPO/releases/$RELEASE_ID/assets?name=nexus-device-agent-linux-amd64"
          fi

          # Device Agent Linux arm64
          if [ -f "apps/device-agent/bin/nexus-device-agent-linux-arm64" ]; then
            echo "Uploading nexus-device-agent-linux-arm64..."
            curl -s -X POST \
              -H "Authorization: token $TOKEN" \
              -F "attachment=@apps/device-agent/bin/nexus-device-agent-linux-arm64" \
              "$API/repos/$REPO/releases/$RELEASE_ID/assets?name=nexus-device-agent-linux-arm64"
          fi

          # Device Agent Windows amd64
          if [ -f "apps/device-agent/bin/nexus-device-agent-windows-amd64.exe" ]; then
            echo "Uploading nexus-device-agent-windows-amd64.exe..."
            curl -s -X POST \
              -H "Authorization: token $TOKEN" \
              -F "attachment=@apps/device-agent/bin/nexus-device-agent-windows-amd64.exe" \
              "$API/repos/$REPO/releases/$RELEASE_ID/assets?name=nexus-device-agent-windows-amd64.exe"
          fi

           # Dashboard UI dist
           if [ -d "apps/dashboard-ui/dist" ]; then
             echo "Creating dashboard-ui-dist.tar.gz..."
             cd apps/dashboard-ui
             tar -czf ../dashboard-ui-dist.tar.gz dist/
             cd ..
             
             echo "Uploading dashboard-ui-dist.tar.gz..."
             curl -s -X POST \
               -H "Authorization: token $TOKEN" \
               -F "attachment=@dashboard-ui-dist.tar.gz" \
               "$API/repos/$REPO/releases/$RELEASE_ID/assets?name=dashboard-ui-dist.tar.gz"
           fi

           # latest.json
           if [ -f "latest.json" ]; then
             echo "Uploading latest.json..."
             curl -s -X POST \
               -H "Authorization: token $TOKEN" \
               -F "attachment=@latest.json" \
               "$API/repos/$REPO/releases/$RELEASE_ID/assets?name=latest.json"
           fi
      - name: Cleanup build artifacts
        if: always()
        run: |
          git config --global --remove-section http || true
          git config --global --unset-all core.askPass || true
          rm -f latest.json dashboard-ui-dist.tar.gz
          rm -rf apps/server-core/bin apps/device-agent/bin apps/dashboard-ui/node_modules apps/dashboard-ui/dist
          echo "Cleanup done"