# This workflow will test if pulling the latest Docker Compose containers from the registry works.
name: Docker Compose Pull

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  test-docker:
    runs-on: ubuntu-latest

    services:
      docker:
        image: docker:26.0.0
        options: --privileged

    steps:
      - name: Get repository and branch information
        id: repo-info
        run: |
          echo "REPO_FULL_NAME=${GITHUB_REPOSITORY}" >> $GITHUB_ENV
          echo "BRANCH_NAME=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_ENV

      - name: Download install script from current branch
        run: |
          INSTALL_SCRIPT_URL="https://raw.githubusercontent.com/$REPO_FULL_NAME/$BRANCH_NAME/install.sh"
          echo "Downloading install script from: $INSTALL_SCRIPT_URL"
          curl -f -o install.sh "$INSTALL_SCRIPT_URL"

      - name: Set permissions and run install.sh
        run: |
          chmod +x install.sh
          ./install.sh install --verbose

      - name: Set up Docker Compose
        run: |
            # Change the exposed host port of the SmtpService from 25 to 2525 because port 25 is not allowed in GitHub Actions
            sed -i 's/25\:25/2525\:25/g' docker-compose.yml
            docker compose -f docker-compose.yml up -d

      - name: Wait for services to be up
        run: |
            # Wait for a few seconds
            sleep 10
      -   name: Test if localhost:443 (WASM app) responds
          uses: nick-fields/retry@v3
          with:
              timeout_minutes: 2
              max_attempts: 3
              command: |
                  http_code=$(curl -k -s -o /dev/null -w "%{http_code}" https://localhost:443)
                  if [ "$http_code" -ne 200 ]; then
                    echo "Service did not respond with 200 OK. Check if client app and/or nginx is configured correctly."
                    exit 1
                  else
                    echo "Service responded with 200 OK"
                  fi

      -   name: Test if localhost:443/api (WebApi) responds
          uses: nick-fields/retry@v3
          with:
              timeout_minutes: 2
              max_attempts: 3
              command: |
                  http_code=$(curl -k -s -o /dev/null -w "%{http_code}" https://localhost:443/api)
                  if [ "$http_code" -ne 200 ]; then
                    echo "Service did not respond with expected 200 OK. Check if WebApi and/or nginx is configured correctly."
                    exit 1
                  else
                    echo "Service responded with $http_code"
                  fi

      -   name: Test if localhost:443/admin (Admin) responds
          uses: nick-fields/retry@v3
          with:
              timeout_minutes: 2
              max_attempts: 3
              command: |
                  http_code=$(curl -k -s -o /dev/null -w "%{http_code}" https://localhost:443/admin/user/login)
                  if [ "$http_code" -ne 200 ]; then
                    echo "Service did not respond with expected 200 OK. Check if admin app and/or nginx is configured correctly."
                    exit 1
                  else
                    echo "Service responded with $http_code"
                  fi

      -   name: Test if localhost:2525 (SmtpService) responds
          uses: nick-fields/retry@v3
          with:
              timeout_minutes: 2
              max_attempts: 3
              command: |
                  if ! nc -zv localhost 2525 2>&1 | grep -q 'succeeded'; then
                    echo "SmtpService did not respond on port 2525. Check if the SmtpService service is running."
                    exit 1
                  else
                    echo "SmtpService responded on port 2525"
                  fi

      - name: Test install.sh reset-password output
        run: |
          output=$(./install.sh reset-password)
          if ! echo "$output" | grep -E '.*New admin password: [A-Za-z0-9+/=]{8,}.*'; then
            echo "Password reset output format is incorrect. Expected format: 'New admin password: <at least 8 base64 chars>'"
            echo "Actual output: $output"
            exit 1
          else
            echo "Password reset output format is correct"
          fi
