name: CI

on:
  push:
    branches:
      - main
    paths-ignore:
      - '.editorconfig'
      - '.gitignore'
      - 'LICENSE'
      - 'README.md'
  workflow_dispatch:
  pull_request:

jobs:
  prepare:
    runs-on: ubuntu-latest
    outputs:
      version: ${{ steps.gh.outputs.version }}
      release: ${{ steps.gh.outputs.release }}
      sha: ${{ steps.gh.outputs.sha }}
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: GH
        id: gh
        env:
          REPO: ${{ github.repository }}
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        shell: bash
        run: |
          echo "version=$(cat Makefile | grep "PKG_VERSION :=" | sed 's/PKG_VERSION := //')" >> $GITHUB_OUTPUT
          echo "release=$(cat Makefile | grep "PKG_RELEASE :=" | sed 's/PKG_RELEASE := //')" >> $GITHUB_OUTPUT
          if [[ "${{ github.event_name }}" != "pull_request" ]]; then
            echo "sha=$(echo ${GITHUB_SHA::7})" >> $GITHUB_OUTPUT
          else
            echo "sha=$(gh api repos/$REPO/commits/main --jq '.sha[:7]')" >> $GITHUB_OUTPUT
          fi

  build-static:
    needs: prepare
    name: build ${{ matrix.arch }}
    runs-on: ubuntu-latest
    strategy:
      matrix:
        arch: [x86_64, x86, aarch64, armhf, armv7]
        branch: [latest-stable]
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up ccache
        uses: actions/cache@v4
        with:
          path: ${{ github.workspace }}/.ccache
          key: ccache-${{ matrix.arch }}-${{ github.run_id }}
          restore-keys: ccache-${{ matrix.arch }}-

      - name: Set up Alpine Linux for ${{ matrix.arch }}
        uses: jirutka/setup-alpine@v1
        with:
          arch: ${{ matrix.arch }}
          branch: ${{ matrix.branch }}
          packages: >
            bash build-base ccache coreutils findutils gawk git grep tar wget xz
            autoconf automake libtool pkgconf linux-headers
          shell-name: alpine.sh

      - name: Build inside chroot
        id: build
        env:
          ARCH: ${{ matrix.arch }}
          CCACHE_DIR: ${{ github.workspace }}/.ccache
          VERSION: ${{ needs.prepare.outputs.version }}
          RELEASE: ${{ needs.prepare.outputs.release }}
          SHA: ${{ needs.prepare.outputs.sha }}
        shell: alpine.sh {0}
        run: |
          case $ARCH in
            x86_64)  PLATFORM=x86-64 ;;
            x86)     PLATFORM=x86 ;;
            aarch64) PLATFORM=arm64 ;;
            armhf)   PLATFORM=arm ;;
            *)       PLATFORM=$ARCH ;;
          esac
          make -j$(nproc) CC="ccache gcc -static-libgcc -static" || exit 1
          strip -s build/youtubeUnblock
          cp -va build/youtubeUnblock .
          tar -czvf youtubeUnblock-$VERSION-$RELEASE-$SHA-$PLATFORM-static.tar.gz youtubeUnblock youtubeUnblock.service README.md
          ccache --show-stats

      - name: Upload artifacts
        if: steps.build.outcome == 'success'
        uses: actions/upload-artifact@v4
        with:
          name: youtubeUnblock-static-${{ matrix.arch }}
          path: ./**/youtubeUnblock*.tar.gz

  build-static-cross:
    needs: prepare
    name: build ${{ matrix.arch }}
    runs-on: ubuntu-latest
    strategy:
      matrix:
        include:
          - arch: mips64el
            tool: mips64el-unknown-linux-musl
          - arch: mips64
            tool: mips64-unknown-linux-musl
          - arch: mipsel
            tool: mipsel-unknown-linux-musl
          - arch: mipselsf
            tool: mipsel-unknown-linux-muslsf
          - arch: mips
            tool: mips-unknown-linux-musl
          - arch: mipssf
            tool: mips-unknown-linux-muslsf
          - arch: armv7sf
            tool: armv7-unknown-linux-musleabi
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up build tools
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          REPO: 'musl-cross/musl-cross'
          TOOL: ${{ matrix.tool }}
        run: |
          mkdir -p $HOME/tools
          gh api repos/$REPO/releases/latest --jq '.tag_name' |\
            xargs -I{} wget -qO- https://github.com/$REPO/releases/download/{}/$TOOL.tar.xz | tar -C $HOME/tools -xJ || exit 1
          [ -d "$HOME/tools/$TOOL/bin" ] && echo "$HOME/tools/$TOOL/bin" >> $GITHUB_PATH

      - name: Build
        id: build
        env:
          ARCH: ${{ matrix.arch }}
          TOOL: ${{ matrix.tool }}
          VERSION: ${{ needs.prepare.outputs.version }}
          RELEASE: ${{ needs.prepare.outputs.release }}
          SHA: ${{ needs.prepare.outputs.sha }}
        run: |
          make -j$(nproc) \
            CC="$TOOL-gcc -static-libgcc -static" \
            LD=$TOOL-ld \
            AR=$TOOL-ar \
            NM=$TOOL-nm \
            STRIP=$TOOL-strip \
            CROSS_COMPILE_PLATFORM=$TOOL || exit 1
          $TOOL-strip -s build/youtubeUnblock
          cp -va build/youtubeUnblock .
          tar -czvf youtubeUnblock-$VERSION-$RELEASE-$SHA-$ARCH-static.tar.gz youtubeUnblock youtubeUnblock.service README.md

      - name: Upload artifacts
        if: steps.build.outcome == 'success'
        uses: actions/upload-artifact@v4
        with:
          name: youtubeUnblock-static-${{ matrix.arch }}
          path: ./**/youtubeUnblock*.tar.gz

  build-openwrt:
    needs: prepare
    runs-on: ubuntu-latest
    strategy:
      matrix:
        branch:
          - openwrt-23.05
        arch:
          - aarch64_cortex-a53
          - aarch64_cortex-a72
          - aarch64_generic
          - arm_arm1176jzf-s_vfp
          - arm_arm926ej-s
          - arm_cortex-a15_neon-vfpv4
          - arm_cortex-a5_vfpv4
          - arm_cortex-a7
          - arm_cortex-a7_neon-vfpv4
          - arm_cortex-a7_vfpv4
          - arm_cortex-a8_vfpv3
          - arm_cortex-a9
          - arm_cortex-a9_neon
          - arm_cortex-a9_vfpv3-d16
          - arm_fa526
          - arm_mpcore
          - arm_xscale
          - mips64_octeonplus
          - mips_24kc
          - mips_4kec
          - mips_mips32
          - mipsel_24kc
          - mipsel_24kc_24kf
          - mipsel_74kc
          - mipsel_mips32
          - x86_64
    container:
      image: openwrt/sdk:${{ matrix.arch }}-${{ matrix.branch }}
      options: --user root
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          ref: 'openwrt'

      - name: Prepare build
        env:
          VERSION: ${{ needs.prepare.outputs.version }}
          RELEASE: ${{ needs.prepare.outputs.release }}
          SHA: ${{ needs.prepare.outputs.sha }}
        run: |
          sed -i "s/PKG_REV:=.*$/PKG_REV:=$SHA/;s/PKG_VERSION:=.*$/PKG_VERSION:=$VERSION-$RELEASE-$SHA/" youtubeUnblock/Makefile

      - name: Initilalize SDK
        id: init_sdk
        env:
          VERSION: ${{ needs.prepare.outputs.version }}
          RELEASE: ${{ needs.prepare.outputs.release }}
          SHA: ${{ needs.prepare.outputs.sha }}
        working-directory: /builder
        run: |
          HOME=/builder ./setup.sh

      - name: Build packages
        id: build
        env:
          VERSION: ${{ needs.prepare.outputs.version }}
          RELEASE: ${{ needs.prepare.outputs.release }}
          SHA: ${{ needs.prepare.outputs.sha }}
        working-directory: /builder
        run: |
          echo "src-link youtubeUnblock $GITHUB_WORKSPACE" >> feeds.conf
          cat feeds.conf
          ./scripts/feeds update youtubeUnblock
          ./scripts/feeds install -a -p youtubeUnblock
          make defconfig
          make package/youtubeUnblock/compile V=s
          mv $(find ./bin -type f -name 'youtubeUnblock*.ipk') ./youtubeUnblock-$VERSION-$RELEASE-$SHA-${{ matrix.arch }}-${{ matrix.branch }}.ipk

      - name: Upload packages
        if: steps.build.outcome == 'success'
        uses: actions/upload-artifact@v4
        with:
          name: youtubeUnblock-${{ matrix.branch }}-${{ matrix.arch }}
          path: /builder/youtubeUnblock*.ipk
          if-no-files-found: error

  build-openwrt-luci:
    needs: prepare
    runs-on: ubuntu-latest
    container:
      image: openwrt/sdk:x86_64-openwrt-23.05
      options: --user root
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          ref: 'openwrt'

      - name: Prepare build
        env:
          VERSION: ${{ needs.prepare.outputs.version }}
          RELEASE: ${{ needs.prepare.outputs.release }}
          SHA: ${{ needs.prepare.outputs.sha }}
        run: |
          sed -i "s/PKG_REV:=.*$/PKG_REV:=$SHA/;s/PKG_VERSION:=.*$/PKG_VERSION:=$VERSION-$RELEASE-$SHA/" youtubeUnblock/Makefile

      - name: Initilalize SDK
        id: init_sdk
        env:
          VERSION: ${{ needs.prepare.outputs.version }}
          RELEASE: ${{ needs.prepare.outputs.release }}
          SHA: ${{ needs.prepare.outputs.sha }}
        working-directory: /builder
        run: |
          HOME=/builder ./setup.sh

      - name: Build packages
        id: build
        env:
          VERSION: ${{ needs.prepare.outputs.version }}
          RELEASE: ${{ needs.prepare.outputs.release }}
          SHA: ${{ needs.prepare.outputs.sha }}
        working-directory: /builder
        run: |
          echo "src-link youtubeUnblock $GITHUB_WORKSPACE" >> feeds.conf
          cat feeds.conf
          ./scripts/feeds update youtubeUnblock
          ./scripts/feeds install -a -p youtubeUnblock
          make defconfig
          make package/luci-app-youtubeUnblock/compile V=s
          mv $(find ./bin -type f -name 'luci-app-youtubeUnblock*.ipk') ./luci-app-youtubeUnblock-$VERSION-$RELEASE-$SHA.ipk

      - name: Upload packages
        if: steps.build.outcome == 'success'
        uses: actions/upload-artifact@v4
        with:
          name: luci-app-youtubeUnblock
          path: /builder/luci-app-youtubeUnblock*.ipk
          if-no-files-found: error

  build-entware:
    needs: prepare
    runs-on: ubuntu-latest
    strategy:
      matrix:
        arch:
          - aarch64-3.10
          - armv7-3.2
          - mips-3.4
          - mipsel-3.4
          - x64-3.2
          - x86-2.6
          - armv7-2.6
    container:
      image: waujito/entware_builder:${{ matrix.arch }}
      options: --user root
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          ref: 'openwrt'

      - name: Prepare build
        env:
          VERSION: ${{ needs.prepare.outputs.version }}
          RELEASE: ${{ needs.prepare.outputs.release }}
          SHA: ${{ needs.prepare.outputs.sha }}
        run: |
          sed -i "s/PKG_REV:=.*$/PKG_REV:=$SHA/;s/PKG_VERSION:=.*$/PKG_VERSION:=$VERSION-$RELEASE-$SHA/" youtubeUnblock/Makefile

      - name: Build packages
        id: build
        working-directory: /home/me/Entware
        env:
          VERSION: ${{ needs.prepare.outputs.version }}
          RELEASE: ${{ needs.prepare.outputs.release }}
          SHA: ${{ needs.prepare.outputs.sha }}
        run: |
          echo "src-link youtubeUnblock $GITHUB_WORKSPACE" >> feeds.conf
          cat feeds.conf
          ./scripts/feeds update youtubeUnblock
          ./scripts/feeds install -a -p youtubeUnblock
          echo "CONFIG_PACKAGE_youtubeUnblockEntware=m" | tee -a .config
          make package/youtubeUnblockEntware/compile V=s

          mv $(find ./bin -type f -name 'youtubeUnblockEntware*.ipk') ./youtubeUnblock-$VERSION-$RELEASE-$SHA-entware-${{ matrix.arch }}.ipk

      - name: Upload packages
        if: steps.build.outcome == 'success'
        uses: actions/upload-artifact@v4
        with:
          name: youtubeUnblock-entware-${{ matrix.arch }}
          path: /home/me/Entware/youtubeUnblock*.ipk
          if-no-files-found: error

  pre-release:
    if: github.event_name != 'pull_request' && github.ref_name == 'main'
    needs: [build-static, build-static-cross, build-openwrt, build-entware, build-openwrt-luci]
    permissions:
      contents: write
    runs-on: ubuntu-latest
    steps:
      - name: Download artifacts
        uses: actions/download-artifact@v4

      - name: Upload assets
        uses: slord399/action-automatic-releases@v1.0.1
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          automatic_release_tag: 'continuous'
          prerelease: true
          draft: true
          title: 'Development build'
          files: |
            ./**/youtubeUnblock*.ipk
            ./**/youtubeUnblock*.tar.gz
            ./**/luci-app-youtubeUnblock*.ipk