parameters:
  arch: 'x86_64'
  coverage: 'OFF'

jobs:
  - job: 'Serenity_Clang_${{ parameters.arch }}_Coverage_${{ parameters.coverage }}'
    timeoutInMinutes: 0 # Setting to 0 means the maximum allowed timeout is used.

    variables:
    - name: LLVM_CCACHE_DIR
      value: $(Build.SourcesDirectory)/Toolchain/.ccache
    - name: LLVM_CCACHE_MAXSIZE
      value: 20GB
    - name: SERENITY_CCACHE_DIR
      value: $(Build.SourcesDirectory)/.ccache

    pool:
      vmImage: ubuntu-22.04

    steps:
    - template: Setup.yml
      parameters:
        os: 'Serenity'

    - template: Caches.yml
      parameters:
        arch: '${{ parameters.arch }}'
        coverage: '${{ parameters.coverage }}'
        toolchain: 'clang'
        download_cache_path: 'Build/caches'
        toolchain_ccache_path: '$(LLVM_CCACHE_DIR)'
        toolchain_ccache_size: '$(LLVM_CCACHE_MAXSIZE)'
        serenity_ccache_path: '$(SERENITY_CCACHE_DIR)'

    - script: ./Toolchain/BuildClang.sh --ci
      displayName: Build Toolchain
      env:
        TRY_USE_LOCAL_TOOLCHAIN: 'y'

    - script: |
        mkdir -p Build/superbuild
      displayName: 'Create Build Directory'

    - script: |
        set -e
        cmake -S Meta/CMake/Superbuild -B Build/superbuild -GNinja \
          -DSERENITY_ARCH=${{ parameters.arch }} \
          -DSERENITY_TOOLCHAIN=Clang \
          -DENABLE_UNDEFINED_SANITIZER=ON \
          -DENABLE_USERSPACE_COVERAGE_COLLECTION=${{ parameters.coverage }} \
          -DDUMP_REGIONS_ON_CRASH=ON \
          -DENABLE_PCI_IDS_DOWNLOAD=OFF \
          -DENABLE_USB_IDS_DOWNLOAD=OFF \
          -DCMAKE_C_COMPILER=gcc-12 \
          -DCMAKE_CXX_COMPILER=g++-12
      displayName: 'Create Build Environment'
      workingDirectory: $(Build.SourcesDirectory)
      env:
        CCACHE_DIR: '$(SERENITY_CCACHE_DIR)'

    - script: |
        set -e
        cmake --build ./Build/superbuild
      displayName: 'Build'
      workingDirectory: $(Build.SourcesDirectory)
      env:
        CCACHE_DIR: '$(SERENITY_CCACHE_DIR)'

    - script: |
        set -e
        ninja install && ninja qemu-image
      displayName: 'Create RootFS'
      workingDirectory: $(Build.SourcesDirectory)/Build/${{ parameters.arch }}clang

    - script: |
        set -e
        ninja run

        echo "##[group]Verify Output File"
        mkdir fsmount
        sudo mount -t ext2 -o loop,rw _disk_image fsmount

        echo "Results: "
        sudo cat fsmount/home/anon/test-results.log
        echo "##[endgroup]"

        if ! sudo grep -q "Failed: 0" fsmount/home/anon/test-results.log
        then
          echo "##[error]:^( Tests failed, failing job"
          exit 1
        fi
        sudo umount fsmount
      displayName: 'Test'
      workingDirectory: $(Build.SourcesDirectory)/Build/${{ parameters.arch }}clang
      timeoutInMinutes: 60
      env:
        SERENITY_QEMU_CPU: 'max,vmx=off'
        SERENITY_KERNEL_CMDLINE: 'graphics_subsystem_mode=off panic=shutdown system_mode=self-test'
        SERENITY_RUN: 'ci'

    - script: |
        [ ! -e debug.log ] || cat debug.log
      displayName: 'Print Target Logs'
      workingDirectory: $(Build.SourcesDirectory)/Build/${{ parameters.arch }}clang
      condition: failed()

    - ${{ if eq(parameters.coverage, 'ON') }}:
      - script: |
          set -e
          ./Meta/analyze-qemu-coverage.sh
        displayName: 'Aggregate Coverage Results'
        workingDirectory: $(Build.SourcesDirectory)
        env:
          SERENITY_TOOLCHAIN: Clang
          SERENITY_ARCH: ${{ parameters.arch }}

      # FIXME: Deploy the static html pages somewhere
      # FIXME: Alter script to also (instead?) produce a raw coverage.txt file for ingestion into sonar cloud
      # Note: tmp_profile_data/Coverage.profdata has the entire combined profile data, but creating the raw txt requires
      #       all of the instrumented binaries and the profdata file.
    - ${{ if eq(parameters.coverage, 'ON') }}:
      - task: PublishPipelineArtifact@1
        inputs:
          targetPath: $(Build.SourcesDirectory)/Build/${{ parameters.arch }}clang/reports
          artifactType: 'pipeline'
          artifactName: 'Coverage'


    - script: |
        echo "##[section]Toolchain Cache"
        CCACHE_DIR='$(LLVM_CCACHE_DIR)' ccache -s

        echo "##[section]Serenity Cache"
        CCACHE_DIR='$(SERENITY_CCACHE_DIR)' ccache -s
      displayName: 'Cache Stats'
