name: Integration Test

on:
  push:
    branches:
      - main
      - dev
  pull_request:
    branches:
      - main
      - dev

jobs:
  cypress-run:
    name: Run Cypress Integration Tests
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4

      - name: Build and run Compose Stack
        run: |
          docker compose --file docker-compose.yaml --file docker-compose.api.yaml up --detach --build
          
      - name: Wait for Ollama to be up
        timeout-minutes: 5
        run: |
          until curl --output /dev/null --silent --fail http://localhost:11434; do
            printf '.'
            sleep 1
          done
          echo "Service is up!"

      - name: Preload Ollama model
        run: |
          docker exec ollama ollama pull qwen:0.5b-chat-v1.5-q2_K

      - name: Cypress run
        uses: cypress-io/github-action@v6
        with:
          browser: chrome
          wait-on: 'http://localhost:3000'
          config: baseUrl=http://localhost:3000

      - uses: actions/upload-artifact@v4
        if: always()
        name: Upload Cypress videos
        with:
          name: cypress-videos
          path: cypress/videos
          if-no-files-found: ignore

      - name: Extract Compose logs
        if: always()
        run: |
          docker compose logs > compose-logs.txt

      - uses: actions/upload-artifact@v4
        if: always()
        name: Upload Compose logs
        with:
          name: compose-logs
          path: compose-logs.txt
          if-no-files-found: ignore

  migration_test:
    name: Run Migration Tests
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgres
        env:
          POSTGRES_PASSWORD: postgres
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          - 5432:5432
#      mysql:
#        image: mysql
#        env:
#          MYSQL_ROOT_PASSWORD: mysql
#          MYSQL_DATABASE: mysql
#        options: >-
#          --health-cmd "mysqladmin ping -h localhost"
#          --health-interval 10s
#          --health-timeout 5s
#          --health-retries 5
#        ports:
#          - 3306:3306
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python-version }}

      - name: Set up uv
        uses: yezz123/setup-uv@v4
        with:
          uv-venv: venv

      - name: Activate virtualenv
        run: |
          . venv/bin/activate
          echo PATH=$PATH >> $GITHUB_ENV

      - name: Install dependencies
        run: |
          uv pip install -r backend/requirements.txt

      - name: Test backend with SQLite
        id: sqlite
        env:
          WEBUI_SECRET_KEY: secret-key
          GLOBAL_LOG_LEVEL: debug
        run: |
          cd backend
          uvicorn main:app --port "8080" --forwarded-allow-ips '*' &
          UVICORN_PID=$!
          # Wait up to 20 seconds for the server to start
          for i in {1..20}; do
              curl -s http://localhost:8080/api/config > /dev/null && break
              sleep 1
              if [ $i -eq 20 ]; then
                  echo "Server failed to start"
                  kill -9 $UVICORN_PID
                  exit 1
              fi
          done
          # Check that the server is still running after 5 seconds
          sleep 5
          if ! kill -0 $UVICORN_PID; then
              echo "Server has stopped"
              exit 1
          fi
          

      - name: Test backend with Postgres
        if: success() || steps.sqlite.conclusion == 'failure'
        env:
          WEBUI_SECRET_KEY: secret-key
          GLOBAL_LOG_LEVEL: debug
          DATABASE_URL: postgresql://postgres:postgres@localhost:5432/postgres
        run: |
          cd backend
          uvicorn main:app --port "8081" --forwarded-allow-ips '*' &
          UVICORN_PID=$!
          # Wait up to 20 seconds for the server to start
          for i in {1..20}; do
              curl -s http://localhost:8081/api/config > /dev/null && break
              sleep 1
              if [ $i -eq 20 ]; then
                  echo "Server failed to start"
                  kill -9 $UVICORN_PID
                  exit 1
              fi
          done
          # Check that the server is still running after 5 seconds
          sleep 5
          if ! kill -0 $UVICORN_PID; then
              echo "Server has stopped"
              exit 1
          fi

#      - name: Test backend with MySQL
#        if: success() || steps.sqlite.conclusion == 'failure' || steps.postgres.conclusion == 'failure'
#        env:
#          WEBUI_SECRET_KEY: secret-key
#          GLOBAL_LOG_LEVEL: debug
#          DATABASE_URL: mysql://root:mysql@localhost:3306/mysql
#        run: |
#          cd backend
#          uvicorn main:app --port "8083" --forwarded-allow-ips '*' &
#          UVICORN_PID=$!
#          # Wait up to 20 seconds for the server to start
#          for i in {1..20}; do
#              curl -s http://localhost:8083/api/config > /dev/null && break
#              sleep 1
#              if [ $i -eq 20 ]; then
#                  echo "Server failed to start"
#                  kill -9 $UVICORN_PID
#                  exit 1
#              fi
#          done
#          # Check that the server is still running after 5 seconds
#          sleep 5
#          if ! kill -0 $UVICORN_PID; then
#              echo "Server has stopped"
#              exit 1
#          fi
