name: Build meta Core for ShellCrash

on:
  workflow_dispatch:
    inputs:
      tag1:
        description: 'project name of meta, such as MetaCubeX/mihomo'
        required: true
        type: string
      tag2:
        description: 'tag or branches of meta, such as v1.18.0 or Alpha'
        required: true
        type: string
      tag3:
        description: 'a new prerelease name (such as clash.meta.alpha) or only upload-artifact'
        required: false
        type: string
      tag4:
        description: 'git push as crashcore (such as meta) or only upload-artifact'
        required: false
        type: string
      tag5:
        description: 'build tags'
        required: false
        type: string
        
jobs:
  go:
    runs-on: ubuntu-latest
    outputs:
      version: ${{steps.go.outputs.version}}
    steps:
      - name: get latest go version
        id: go
        run: |
          echo version=$(curl -s https://raw.githubusercontent.com/actions/go-versions/update-versions-manifest-file/versions-manifest.json | grep -oE '"version": "[0-9]{1}.[0-9]{1,}(.[0-9]{1,})?"' | head -1 | cut -d':' -f2 | sed 's/ //g; s/"//g') >> $GITHUB_OUTPUT
  
  meta:
    runs-on: ubuntu-latest
    needs: go
    env:
      REPO: ${{ github.event.inputs.tag1 }}
      TAGS: ${{ github.event.inputs.tag5 }}
    outputs:
      version: ${{steps.meta.outputs.version}}
      tags: ${{steps.meta.outputs.tags}}
    steps:

      - name: setup go
        uses: actions/setup-go@v4.1.0
        with:
          go-version: ${{needs.go.outputs.version}}
          
      - name: get meta version
        id: meta
        run: |
          version=${{ github.event.inputs.tag2 }}
          echo version=$version >> $GITHUB_OUTPUT
          if [ -z "$TAGS" ];then
            echo tags='' >> $GITHUB_OUTPUT
          else
            echo tags=$TAGS >> $GITHUB_OUTPUT
          fi      

  cross:
    strategy:
      matrix:
        include:
          # linux
          - name: linux-amd64
            goos: linux
            goarch: amd64
            goamd64: v1
          - name: linux-386
            goos: linux
            goarch: 386
          - name: linux-arm64
            goos: linux
            goarch: arm64
          - name: linux-armv5
            goos: linux
            goarch: arm
            goarm: 5
          - name: linux-armv7
            goos: linux
            goarch: arm
            goarm: 7
          - name: linux-mips-softfloat
            goos: linux
            goarch: mips
            gomips: softfloat
          - name: linux-mipsle-softfloat
            goos: linux
            goarch: mipsle
            gomips: softfloat
          - name: linux-mipsle-hardfloat
            goos: linux
            goarch: mipsle
            gomips: hardfloat   

      fail-fast: false
    runs-on: ubuntu-latest
    needs: 
      - go
      - meta
    env:
      GOOS: ${{ matrix.goos }}
      GOARCH: ${{ matrix.goarch }}
      GOAMD64: ${{ matrix.goamd64 }}
      GOARM: ${{ matrix.goarm }}
      GOMIPS: ${{ matrix.gomips }}
      CGO_ENABLED: 0
      TAGS: ${{needs.meta.outputs.tags}}
      VERSION: ${{needs.meta.outputs.version}}
    steps:
      - name: Checkout meta
        uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
        with:
          repository: ${{ github.event.inputs.tag1 }}
          ref: ${{ github.event.inputs.tag2 }}
          fetch-depth: 1
          
      - name: Setup Go
        uses: actions/setup-go@v5
        with:
          go-version: ${{needs.go.outputs.version}}
          
      - name: Set ENV
        run: |
          sudo timedatectl set-timezone "Asia/Shanghai"
          echo "BUILDTIME=$(date)" >> $GITHUB_ENV
        shell: bash
          
      - name: build core
        id: build
        run: go build -v -trimpath -ldflags "-X 'github.com/metacubex/mihomo/constant.Version=${VERSION}' -X 'github.com/metacubex/mihomo/constant.BuildTime=${BUILDTIME}' -s -w -buildid=" -tags "${TAGS}" -o meta
        
      - name: Upload file to workspace
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.name }}
          path: meta
          
  push_to_git:
    needs: 
      - cross
      - meta
    runs-on: ubuntu-latest
    env: 
      RELEASE: ${{ github.event.inputs.tag3 }}
      PUSHDIR: ${{ github.event.inputs.tag4 }}
      VERSION: ${{needs.meta.outputs.version}}
    steps:
      - name: Checkout ShellCrash
        uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
        with:
          fetch-depth: 1
          
      - name: Download file from workspace
        uses: actions/download-artifact@v4
        with:
          path: ./tmp
          
      - name: Zip core by tar
        run: |      
          for arch in amd64 armv5 armv7 arm64 mips-softfloat mipsle-hardfloat mipsle-softfloat;do
            mv -f ./tmp/linux-${arch}/meta ./tmp/CrashCore
            chmod +x ./tmp/CrashCore
            tar --no-same-owner -zcvf ./tmp/clash-linux-${arch}.tar.gz -C ./tmp CrashCore
          done
          
      - name: Commit and push
        if: ${{ env.PUSHDIR != '' }}
        run: |
          crashcore='meta'
          mkdir -p ./bin/${crashcore}
          rm -fr ./bin/${crashcore}/*
          mv -f ./tmp/clash-linux-*.tar.gz ./bin/${crashcore}/
          rm -fr ./tmp
          sed -i "s/${crashcore}_v=.*/${crashcore}_v=${VERSION}/" ./bin/version
          git config --global user.email "github-actions[bot]@users.noreply.github.com" && git config --global user.name "github-actions[bot]"
          git add . && git commit -m "更新${crashcore}内核至${VERSION}" || exit 0
          git push
          
      - name: Create Release and Upload Release Asset
        if: ${{ env.RELEASE != '' && env.PUSHDIR == '' }}
        uses: softprops/action-gh-release@v1
        with:
          tag_name: ${{ github.event.inputs.tag3 }}
          name: ${{ github.event.inputs.tag3 }}
          body: "The ${{env.VERSION}} version of ${{ github.event.inputs.tag1 }} \n这是${{ github.event.inputs.tag1 }}的${{env.VERSION}}版本内核文件\nhttps://github.com/${{ github.event.inputs.tag1 }}/releases \nOnly support for ShellCrash\n仅适配ShellCrash项目"
          draft: false
          prerelease: true
          files: |
            ./tmp/clash*.tar.gz 
          
      - name: Cleanup Workflow
        uses: Mattraks/delete-workflow-runs@main
        with:
          retain_days: 1
          keep_minimum_runs: 2      
