name: Backend CI/CD

on:
  push:
  pull_request:
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    # Service containers to run with `container-job`
    services:
      # Label used to access the service container
      postgres:
        # Docker Hub image
        image: postgres
        # Provide the password for postgres
        env:
          POSTGRES_PASSWORD: ${{ secrets.EHAYVAN_SPRING_DATASOURCE_PASSWORD }}
        # Set health checks to wait until postgres has started
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          # Maps tcp port 5432 on service container to the host
          - 5432:5432
    
    steps:
    - uses: actions/checkout@v3
    - name: Set Environment Variables
      run: | 
        echo "EHAYVAN_SPRING_DATASOURCE_URL=${{ secrets.EHAYVAN_SPRING_DATASOURCE_URL }}" >> $GITHUB_ENV
        echo "EHAYVAN_SPRING_DATASOURCE_USERNAME=${{ secrets.EHAYVAN_SPRING_DATASOURCE_USERNAME }}" >> $GITHUB_ENV
        echo "EHAYVAN_SPRING_DATASOURCE_PASSWORD=${{ secrets.EHAYVAN_SPRING_DATASOURCE_PASSWORD }}" >> $GITHUB_ENV
    - name: Set up JDK 21
      uses: actions/setup-java@v3
      with:
        java-version: '21'
        distribution: 'temurin'
        cache: maven
    - name: Build Spring Boot Project
      run: mvn clean install -DskipTests
    - name: Run tests with Maven for Spring Boot Project
      run: mvn -B test --file pom.xml
      
  coverage:
    needs: build
    runs-on: ubuntu-latest

    # Service containers to run with `container-job`
    services:
      # Label used to access the service container
      postgres:
        # Docker Hub image
        image: postgres
        # Provide the password for postgres
        env:
          POSTGRES_PASSWORD: ${{ secrets.EHAYVAN_SPRING_DATASOURCE_PASSWORD }}
        # Set health checks to wait until postgres has started
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          # Maps tcp port 5432 on service container to the host
          - 5432:5432
          
    steps:
    - uses: actions/checkout@v3
    - name: Set Environment Variables
      run: | 
        echo "EHAYVAN_SPRING_DATASOURCE_URL=${{ secrets.EHAYVAN_SPRING_DATASOURCE_URL }}" >> $GITHUB_ENV
        echo "EHAYVAN_SPRING_DATASOURCE_USERNAME=${{ secrets.EHAYVAN_SPRING_DATASOURCE_USERNAME }}" >> $GITHUB_ENV
        echo "EHAYVAN_SPRING_DATASOURCE_PASSWORD=${{ secrets.EHAYVAN_SPRING_DATASOURCE_PASSWORD }}" >> $GITHUB_ENV
    - name: Set up JDK 21
      uses: actions/setup-java@v3
      with:
        java-version: '21'
        distribution: 'temurin'
        cache: maven
    - name: Run maven for coverage report
      run: mvn -B verify -P coverage --no-transfer-progress
    - name: Upload coverage reports to Codecov
      uses: codecov/codecov-action@v3
      env:
        file: ./**/target/site/jacoco/jacoco.xml
        CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}