name: build

on:
  workflow_dispatch:
    inputs:
      logLevel:
        description: "Log level"
        required: true
        default: "warning"
        type: choice
        options:
          - info
          - warning
          - debug
      build:
        description: "Build"
        required: false
        default: false
        type: boolean
      update_readme:
        description: "Update Readme"
        required: false
        default: false
        type: boolean
      create_release:
        description: "Create Release (requires build)"
        required: false
        default: false
        type: boolean

  push:
    branches:
      - dev
      - master
    paths-ignore:
      - "**.md"
      - ".github/**"
  pull_request:
    branches:
      - "master"
    paths-ignore:
      - "**.md"
      - ".github/ISSUE_TEMPLATE/**"

env:
  DOCKERHUB_SLUG: arabcoders/ytptube
  GHCR_SLUG: ghcr.io/arabcoders/ytptube
  PLATFORMS: linux/amd64

jobs:
  build-pr:
    runs-on: ubuntu-latest
    if: github.event_name == 'pull_request'
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install frontend dependencies
        uses: bahmutov/npm-install@v1
        with:
          working-directory: ui
          install-command: yarn --production --prefer-offline --frozen-lockfile

      - name: Build frontend
        uses: bahmutov/npm-install@v1
        with:
          working-directory: ui
          install-command: yarn run generate

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

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

      - name: Build commit to check.
        uses: docker/build-push-action@v5
        with:
          context: .
          platforms: linux/amd64
          push: false
          cache-from: type=gha, scope=pr_${{ github.workflow }}
          cache-to: type=gha, scope=pr_${{ github.workflow }}

  push-build:
    runs-on: ubuntu-latest
    if: github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && github.event.inputs.build == 'true')
    permissions:
      packages: write
      contents: write
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install frontend dependencies
        uses: bahmutov/npm-install@v1
        with:
          working-directory: ui
          install-command: yarn --production --prefer-offline --frozen-lockfile

      - name: Build frontend
        uses: bahmutov/npm-install@v1
        with:
          working-directory: ui
          install-command: yarn run generate

      - name: Update Version File
        uses: ArabCoders/write-version-to-file@master
        with:
          filename: "/app/library/version.py"
          placeholder: "dev-master"
          with_date: "true"
          with_branch: "true"

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

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

      - name: Set Platforms Based on Branch
        id: set_platforms
        run: |
          if [ "${GITHUB_REF}" == "refs/heads/${{ github.repository.default_branch }}" ]; then
            echo "PLATFORMS=linux/amd64,linux/arm64" >> $GITHUB_ENV
          else
            echo "PLATFORMS=linux/amd64" >> $GITHUB_ENV
          fi

      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: |
            ${{ env.DOCKERHUB_SLUG }}
            ${{ env.GHCR_SLUG }}
          tags: |
            type=raw,value=latest,enable=${{ endsWith(github.ref, github.event.repository.default_branch) }}
            type=ref,event=branch
            type=ref,event=tag
            type=raw,value={{branch}}{{base_ref}}-{{date 'YYYYMMDD'}}-{{sha}}
          flavor: |
            latest=false

      - name: Login to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Login to DockerHub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          platforms: ${{ env.PLATFORMS }}
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha, scope=${{ github.workflow }}
          cache-to: type=gha, scope=${{ github.workflow }}

      - name: Version tag
        uses: arabcoders/action-python-autotagger@master
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          repo_name: arabcoders/ytptube
          path: app/library/version.py
          regex: 'APP_VERSION\s=\s\"(.+)\"'

  dockerhub-sync-readme:
    runs-on: ubuntu-latest
    if: (github.event_name == 'push' && endsWith(github.ref, github.event.repository.default_branch)) || (github.event_name == 'workflow_dispatch' && github.event.inputs.update_readme == 'true')
    steps:
      - name: Sync README
        uses: docker://lsiodev/readme-sync:latest
        env:
          DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
          DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }}
          GIT_REPOSITORY: ${{ github.repository }}
          DOCKER_REPOSITORY: ${{ env.DOCKERHUB_SLUG }}
          GIT_BRANCH: master
        with:
          entrypoint: node
          args: /opt/docker-readme-sync/sync
