name: BuildApp

on:
  workflow_dispatch: {}
  push:
    branches:
      - main
      
concurrency:
  group: build-${{ github.ref }}
  cancel-in-progress: false

jobs:
  build-frontend:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: https://github.com/actions/checkout@v4

      - name: Use Node.js 20
        uses: https://github.com/actions/setup-node@v4
        with:
          node-version: 20

      - name: Install Angular CLI
        run: npm install -g @angular/cli

      - name: Install PNPM
        run: npm install -g pnpm

      - name: Install dependencies
        working-directory: src/Frontend
        run: pnpm install

      - name: Build Angular
        working-directory: src/Frontend
        run: ng build --configuration=production

      - name: Upload artifact (frontend)
        uses: https://github.com/actions/upload-artifact@v3
        with:
          name: frontend
          path: src/Frontend/dist
          if-no-files-found: error
          retention-days: 7

  build-backend:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: https://github.com/actions/checkout@v4

      - name: Setup .NET 8
        uses: https://github.com/actions/setup-dotnet@v4
        with:
          dotnet-version: 8.0.x

      - name: Restore dependencies
        working-directory: src/Backend
        run: dotnet restore DiunaBI.sln

      - name: Build solution and prepare plugins
        working-directory: src/Backend
        run: |
          set -e
          dotnet build DiunaBI.sln --configuration Release
          dotnet build DiunaBI.Plugins.Morska/DiunaBI.Plugins.Morska.csproj --configuration Release
          mkdir -p DiunaBI.Tests/bin/Release/net8.0/Plugins
          cp DiunaBI.Plugins.Morska/bin/Release/net8.0/DiunaBI.Plugins.Morska.dll DiunaBI.Tests/bin/Release/net8.0/Plugins/
          cp DiunaBI.Plugins.Morska/bin/Release/net8.0/DiunaBI.Core.dll DiunaBI.Tests/bin/Release/net8.0/Plugins/
          ls -la DiunaBI.Tests/bin/Release/net8.0/Plugins/

      - name: Run Tests
        working-directory: src/Backend
        run: |
          dotnet add DiunaBI.Tests/DiunaBI.Tests.csproj package coverlet.collector
          dotnet test DiunaBI.Tests/DiunaBI.Tests.csproj \
            --configuration Release \
            --no-restore \
            --logger "trx;LogFileName=test-results.trx" \
            --collect:"XPlat Code Coverage" \
            --filter "Category!=LocalOnly"

      - name: Publish Test Results
        uses: https://github.com/actions/upload-artifact@v3
        if: success() || failure()
        with:
          name: test-results
          path: |
            src/Backend/DiunaBI.Tests/TestResults/*.trx
            src/Backend/DiunaBI.Tests/TestResults/**/coverage.cobertura.xml
          retention-days: 7

      - name: Publish WebAPI
        if: success()
        working-directory: src/Backend
        run: |
          dotnet publish DiunaBI.WebAPI/DiunaBI.WebAPI.csproj \
            --configuration Release \
            --framework net8.0 \
            --self-contained false \
            --output ../../build/webapi
          mkdir -p ../../build/webapi/Plugins
          cp DiunaBI.Plugins.Morska/bin/Release/net8.0/DiunaBI.Plugins.Morska.dll ../../build/webapi/Plugins/
          ls -la ../../build/webapi/Plugins/

      - name: Clean up sensitive files
        working-directory: build/webapi
        run: |
          rm -f appsettings.Development.json || true
          rm -f client_secrets.Development.json || true

      - name: Upload artifact (webapi)
        uses: https://github.com/actions/upload-artifact@v3
        with:
          name: webapi
          path: build/webapi
          if-no-files-found: error
          retention-days: 7