name: .NET Build Test and Sonar Scan

on:
  push:
    branches: '**'
  pull_request:
    branches: [ main, develop ]
    types: [synchronize]

jobs:
  build:
    name: Build .Net
    runs-on: windows-latest
    steps:
      - name: Checkout Repo
        uses: actions/checkout@v2
        with:
            fetch-depth: 0

      - name: Setup .NET Core
        uses: actions/setup-dotnet@v1
        with:
          include-prerelease: True
          dotnet-version: '6.0'

      - name: Install dependencies
        run: dotnet restore

      - name: Set up JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 1.11

      - uses: actions/upload-artifact@v2
        with:
          name: csproj
          path: Kavita.Common/Kavita.Common.csproj

#  test:
#    name: Install Sonar & Test
#    needs: build
#    runs-on: windows-latest
#    steps:
#      - name: Checkout Repo
#        uses: actions/checkout@v2
#        with:
#            fetch-depth: 0
#
#      - name: Setup .NET Core
#        uses: actions/setup-dotnet@v1
#        with:
#          include-prerelease: True
#          dotnet-version: '6.0'
#
#      - name: Install dependencies
#        run: dotnet restore
#
#      - name: Set up JDK 11
#        uses: actions/setup-java@v1
#        with:
#          java-version: 1.11
#
#      - name: Cache SonarCloud packages
#        uses: actions/cache@v1
#        with:
#          path: ~\sonar\cache
#          key: ${{ runner.os }}-sonar
#          restore-keys: ${{ runner.os }}-sonar
#
#      - name: Cache SonarCloud scanner
#        id: cache-sonar-scanner
#        uses: actions/cache@v1
#        with:
#          path: .\.sonar\scanner
#          key: ${{ runner.os }}-sonar-scanner
#          restore-keys: ${{ runner.os }}-sonar-scanner
#
#      - name: Install SonarCloud scanner
#        if: steps.cache-sonar-scanner.outputs.cache-hit != 'true'
#        shell: powershell
#        run: |
#          New-Item -Path .\.sonar\scanner -ItemType Directory
#          dotnet tool update dotnet-sonarscanner --tool-path .\.sonar\scanner
#
#      - name: Sonar Scan
#        env:
#          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}  # Needed to get PR information, if any
#          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
#        shell: powershell
#        run: |
#          .\.sonar\scanner\dotnet-sonarscanner begin /k:"Kareadita_Kavita" /o:"kareadita" /d:sonar.login="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonarcloud.io"
#          dotnet build --configuration Release
#          .\.sonar\scanner\dotnet-sonarscanner end /d:sonar.login="${{ secrets.SONAR_TOKEN }}"
#
#      - name: Test
#        run: dotnet test --no-restore --verbosity normal

  version:
    name: Bump version on Develop push
    needs: [ build ]
    runs-on: ubuntu-latest
    if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/develop' }}
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Setup .NET Core
        uses: actions/setup-dotnet@v1
        with:
            include-prerelease: True
            dotnet-version: '6.0'

      - name: Install dependencies
        run: dotnet restore

      - name: Build
        run: dotnet build --configuration Release --no-restore

      - name: Bump versions
        uses: ThomasEg/dotnet-bump-version@patch-1
        with:
          version_files: Kavita.Common/Kavita.Common.csproj
          github_token: ${{ secrets.REPO_GHA_PAT }}

  develop:
    name: Build Nightly Docker if Develop push
    needs: [ build, version ]
    runs-on: ubuntu-latest
    if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/develop' }}
    steps:
      - name: Find Current Pull Request
        uses: jwalton/gh-find-current-pr@v1.0.2
        id: findPr
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}

      - name: Parse PR body
        id: parse-body
        run: |
          body="${{ steps.findPr.outputs.body }}"
          if [[ ${#body} -gt 1870 ]] ; then
            body=${body:0:1870}
            body="${body}...and much more.

            Read full changelog: https://github.com/Kareadita/Kavita/pull/${{ steps.findPr.outputs.pr }}"
          fi

          body=${body//\'/}
          body=${body//'%'/'%25'}
          body=${body//$'\n'/'%0A'}
          body=${body//$'\r'/'%0D'}
          body=${body//$'`'/'%60'}
          body=${body//$'>'/'%3E'}
          echo $body
          echo "::set-output name=BODY::$body"

      - name: Check Out Repo
        uses: actions/checkout@v2
        with:
          ref: develop

      - name: NodeJS to Compile WebUI
        uses: actions/setup-node@v2.1.5
        with:
          node-version: '14'
      - run: |
          cd UI/Web || exit
          echo 'Installing web dependencies'
          npm install

          echo 'Building UI'
          npm run prod

          echo 'Copying back to Kavita wwwroot'
          rsync -a dist/ ../../API/wwwroot/

          cd ../ || exit

      - name: Get csproj Version
        uses: naminodarie/get-net-sdk-project-versions-action@v1
        id: get-version
        with:
          proj-path: Kavita.Common/Kavita.Common.csproj

      - name: Echo csproj version
        run: echo "${{steps.get-version.outputs.assembly-version}}"

      - name: Compile dotnet app
        uses: actions/setup-dotnet@v1
        with:
          include-prerelease: True
          dotnet-version: '6.0'
      - run: ./monorepo-build.sh

      - name: Login to Docker Hub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKER_HUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}

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

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

      - name: Build and push
        id: docker_build
        uses: docker/build-push-action@v2
        with:
          context: .
          platforms: linux/amd64,linux/arm/v7,linux/arm64
          push: true
          tags: kizaing/kavita:nightly

      - name: Image digest
        run: echo ${{ steps.docker_build.outputs.digest }}

      - name: Notify Discord
        uses: rjstone/discord-webhook-notify@v1
        with:
            severity: info
            description: v${{steps.get-version.outputs.assembly-version}} - ${{ steps.findPr.outputs.title }}
            details: '${{ steps.parse-body.outputs.BODY }}'
            text: A new nightly build has been released for docker.
            webhookUrl: ${{ secrets.DISCORD_DOCKER_UPDATE_URL }}

  stable:
    name: Build Stable Docker if Main push
    needs: [ build ]
    runs-on: ubuntu-latest
    if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
    steps:

      - name: Find Current Pull Request
        uses: jwalton/gh-find-current-pr@v1.0.2
        id: findPr
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}

      - name: Parse PR body
        id: parse-body
        run: |
          body="${{ steps.findPr.outputs.body }}"
          if [[ ${#body} -gt 1870 ]] ; then
            body=${body:0:1870}
            body="${body}...and much more.

            Read full changelog: https://github.com/Kareadita/Kavita/releases/latest"
          fi

          body=${body//\'/}
          body=${body//'%'/'%25'}
          body=${body//$'\n'/'%0A'}
          body=${body//$'\r'/'%0D'}
          body=${body//$'`'/'%60'}
          body=${body//$'>'/'%3E'}
          echo $body
          echo "::set-output name=BODY::$body"

      - name: Check Out Repo
        uses: actions/checkout@v2
        with:
          ref: main

      - name: NodeJS to Compile WebUI
        uses: actions/setup-node@v2.1.5
        with:
          node-version: '14'
      - run: |

          cd UI/Web || exit
          echo 'Installing web dependencies'
          npm install

          echo 'Building UI'
          npm run prod

          echo 'Copying back to Kavita wwwroot'
          rsync -a dist/ ../../API/wwwroot/

          cd ../ || exit

      - name: Get csproj Version
        uses: naminodarie/get-net-sdk-project-versions-action@v1
        id: get-version
        with:
          proj-path: Kavita.Common/Kavita.Common.csproj

      - name: Echo csproj version
        run: echo "${{steps.get-version.outputs.assembly-version}}"

      - name: Parse Version
        run: |
          version='${{steps.get-version.outputs.assembly-version}}'
          newVersion=${version%.*}
          echo $newVersion
          echo "::set-output name=VERSION::$newVersion"
        id: parse-version

      - name: Compile dotnet app
        uses: actions/setup-dotnet@v1
        with:
          include-prerelease: True
          dotnet-version: '6.0'
      - run: ./monorepo-build.sh

      - name: Login to Docker Hub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKER_HUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}

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

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

      - name: Build and push
        id: docker_build
        uses: docker/build-push-action@v2
        with:
          context: .
          platforms: linux/amd64,linux/arm/v7,linux/arm64
          push: true
          tags: kizaing/kavita:latest, kizaing/kavita:${{ steps.parse-version.outputs.VERSION }}

      - name: Image digest
        run: echo ${{ steps.docker_build.outputs.digest }}

      - name: Notify Discord
        uses: rjstone/discord-webhook-notify@v1
        with:
            severity: info
            description: v${{steps.get-version.outputs.assembly-version}} - ${{ steps.findPr.outputs.title }}
            details: '${{ steps.parse-body.outputs.BODY }}'
            text: A new stable build has been released.
            webhookUrl: ${{ secrets.DISCORD_DOCKER_UPDATE_URL }}
