name: CI Build

on:
  push:
    branches: [ develop, master ]
  workflow_dispatch:

jobs:
  build-ui:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v2
        with:
          node-version: '18'

      - name: NodeModules Cache
        uses: actions/cache@v2
        with:
          path: '**/node_modules'
          key: node_modules-${{ hashFiles('**/yarn.lock') }}

      - name: UI Install
        run: yarn --cwd ./src/Ombi/ClientApp install

      - name: Build UI
        run: yarn --cwd ./src/Ombi/ClientApp run build

      - name: Publish UI Artifacts
        uses: actions/upload-artifact@v2
        with:
          name: angular_dist
          path: |
            ./src/Ombi/ClientApp/dist

  unit-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-dotnet@v1
        with:
          dotnet-version: '6.0.x'

      - name: Nuget Cache
        uses: actions/cache@v2
        with:
          path: ~/.nuget/packages
          key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
          restore-keys: |
            ${{ runner.os }}-nuget

      - name: Run Unit Tests
        run: |
          cd src
          dotnet test -c NonUiBuild --logger trx --results-directory "TestResults"

  versioning:
     runs-on: ubuntu-latest
     needs: [ build-ui, unit-test ]
     outputs:
      changelog: ${{ steps.changelog.outputs.clean_changelog }}
      tag: ${{ steps.changelog.outputs.tag }}
      version: ${{ steps.changelog.outputs.version }}
     steps:
       - uses: actions/checkout@v2
       - name: Conventional Changelog Action
         id: changelog
         uses: TriPSs/conventional-changelog-action@v3
         with:
          version-file: 'version.json'
          release-count: 40
          skip-on-empty: 'false'
          git-message: 'chore(release): :rocket: {version}'

       - name: Output version
         run: |
           echo "outputs: ${{ steps.changelog.outputs.tag }}"
           echo "Version: ${{ steps.changelog.outputs.version }}"
           echo "log: ${{ steps.changelog.outputs.clean_changelog }}"

  publish:
    runs-on: ubuntu-latest
    needs: [ build-ui, versioning ]
    strategy:
      matrix:
        include:
          - os: win10-x64
            format: zip
            compression: zip
          - os: win10-x86
            format: zip
            compression: zip
          - os: linux-x64
            format: tar.gz
            compression: tar
          - os: linux-arm
            format: tar.gz
            compression: tar
          - os: linux-arm64
            compression: tar
            format: tar.gz
          - os: osx-x64
            compression: tar
            format: tar.gz
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-dotnet@v1
        with:
          dotnet-version: '6.0.x'      
      - uses: actions/setup-dotnet@v1
        with:
          dotnet-version: '5.0.x'

      - name: Nuget Cache
        uses: actions/cache@v2
        with:
          path: ~/.nuget/packages
          key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
          restore-keys: |
            ${{ runner.os }}-nuget

      - name: Set Backend Version
        run: |
          dotnet tool install -g dotnet-setversion
          setversion -r ${{ needs.versioning.outputs.version }}
        working-directory: src

      - name: Publish Backend ${{ matrix.os }}
        run: dotnet publish -c Release -r ${{ matrix.os }} -o "${{ matrix.os }}" --self-contained true -p:PublishSingleFile=true
        working-directory: src/Ombi

      - name: Download Angular
        uses: actions/download-artifact@v2
        with:
          name: angular_dist
          path: ~/src/Ombi/dist

      - name: Copy Dist to Artifacts
        run: |
          cd ${{ matrix.os }}
          sudo mkdir -p ClientApp/dist
          echo "mkdir /ClientApp"
          echo "list os (ClientApp should be here)"
          ls
          cd ..
          echo "Copy dist to /ClientApp"
          sudo mv ~/src/Ombi/dist/* ${{ matrix.os }}/ClientApp/dist
        working-directory: src/Ombi

      - name: Archive Release
        uses: thedoctor0/zip-release@master
        with:
          type: '${{ matrix.compression }}'
          filename: '../${{ matrix.os }}.${{ matrix.format }}'
          path: '.'
          directory: 'src/Ombi/${{ matrix.os }}'

      - name: Publish Release
        uses: actions/upload-artifact@v2
        with:
          name: ${{ matrix.os }}
          path: |
            ./src/Ombi/${{ matrix.os }}.${{ matrix.format }}

  release:
    needs: [ publish, unit-test, versioning ]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Download Artifacts
        id: download
        uses: actions/download-artifact@v2
        with:
          path: artifacts

      - name: Publish to GitHub Master
        uses: softprops/action-gh-release@v1
        if: contains(github.ref, 'master')
        with:
          body: ${{ needs.versioning.outputs.changelog }}
          name: ${{ needs.versioning.outputs.tag }}
          tag_name: ${{ needs.versioning.outputs.tag }}
          files: |
            artifacts/**/*.tar.gz
            artifacts/**/*.zip

      - name: Publish to GitHub Develop
        uses: softprops/action-gh-release@v1
        if: contains(github.ref, 'develop')
        with:
          prerelease: true
          generate_release_notes: true
          body: ${{ needs.versioning.outputs.changelog }}
          name: ${{ needs.versioning.outputs.tag }}
          tag_name: ${{ needs.versioning.outputs.tag }}
          files: |
            artifacts/**/*.tar.gz
            artifacts/**/*.zip

  update-apt:
    needs: [ release, versioning ]
    runs-on: ubuntu-latest
    steps:
    - name: Trigger APT Build
      uses: fjogeleit/http-request-action@master
      with:
        url: 'https://api.github.com/repos/Ombi-app/Ombi.Apt/actions/workflows/build-deb.yml/dispatches'
        method: 'POST'
        contentType: 'application/json'
        data: '{ "ref":"main", "inputs": { "version": "${{ needs.versioning.outputs.tag }}"} }'
        customHeaders: '{"Accept":"application/vnd.github.v3+json", "Authorization":"Bearer ${{secrets.APT_PAT}}", "User-Agent":"Ombi"}'


