name: Build & Push Docker Images
run-name: ${{ gitea.actor }} - ${{ gitea.ref }}

on:
  push:
    branches:
    - main

jobs:
  detect-changes:
    name: Detect Changes
    runs-on: ubuntu-latest
    outputs:
      backend: ${{ steps.filter.outputs.backend }}
      frontend: ${{ steps.filter.outputs.frontend }}
    steps:
    - uses: actions/checkout@v4
    - uses: dorny/paths-filter@v3
      id: filter
      with:
        filters: |
          backend:
            - 'apps/backend/**'
            - 'packages/**'
          frontend:
            - 'apps/frontend/**'
            - 'packages/**'

  test-backend:
    name: Backend Tests
    needs: detect-changes
    if: needs.detect-changes.outputs.backend == 'true'
    runs-on: ubuntu-latest
    timeout-minutes: 15
    steps:
    - uses: actions/checkout@v4
    - name: Setup Node.js
      uses: actions/setup-node@v4
      with:
        node-version: '22'
        cache: 'npm'
    - name: Install dependencies
      run: npm ci --ignore-scripts
    - name: Install backend native deps
      run: npm rebuild sqlite3 bcrypt --workspace=farma-clic-backend
    - name: Run tests
      run: npm test --workspace=farma-clic-backend

  test-frontend:
    name: Frontend Tests
    needs: detect-changes
    if: needs.detect-changes.outputs.frontend == 'true'
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
    - uses: actions/checkout@v4
    - name: Setup Node.js
      uses: actions/setup-node@v4
      with:
        node-version: '22'
        cache: 'npm'
    - name: Install dependencies
      run: npm ci --ignore-scripts
    - name: Run tests
      run: npm test --workspace=farma-clic-frontend -- --run --reporter=basic

  build-backend:
    name: Build Backend
    needs: [ detect-changes, test-backend ]
    if: |
      always() &&
      needs.detect-changes.outputs.backend == 'true' &&
      (needs.test-backend.result == 'success' || needs.test-backend.result == 'skipped')
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: Log in to Gitea registry
      uses: docker/login-action@v3
      with:
        registry: git.hacecalor.net
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}
    - name: Build and push backend image
      uses: docker/build-push-action@v5
      with:
        context: .
        file: ./apps/backend/Dockerfile
        push: true
        tags: |
          git.hacecalor.net/ichitux/farmafinder-backend:latest
          git.hacecalor.net/ichitux/farmafinder-backend:${{ gitea.sha }}

  build-frontend:
    name: Build Frontend
    needs: [ detect-changes, test-frontend ]
    if: |
      always() &&
      needs.detect-changes.outputs.frontend == 'true' &&
      (needs.test-frontend.result == 'success' || needs.test-frontend.result == 'skipped')
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: Log in to Gitea registry
      uses: docker/login-action@v3
      with:
        registry: git.hacecalor.net
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}
    - name: Build and push frontend image
      uses: docker/build-push-action@v5
      with:
        context: ./apps/frontend
        push: true
        tags: |
          git.hacecalor.net/ichitux/farmafinder-frontend:latest
          git.hacecalor.net/ichitux/farmafinder-frontend:${{ gitea.sha }}

  deploy:
    name: Deploy
    needs: [ detect-changes, build-backend, build-frontend ]
    if: |
      always() &&
      (needs.build-backend.result == 'success' || needs.build-backend.result == 'skipped') &&
      (needs.build-frontend.result == 'success' || needs.build-frontend.result == 'skipped') &&
      (needs.detect-changes.outputs.backend == 'true' || needs.detect-changes.outputs.frontend == 'true')
    runs-on: ubuntu-latest
    steps:
    - name: SSH to remote server
      uses: appleboy/ssh-action@v1.0.3
      with:
        host: ${{ secrets.HOST }}
        username: ${{ secrets.USERNAME }}
        password: ${{ secrets.PASSWORD }}
        port: ${{ secrets.PORT }}
        script: |
          cd /docker/FarmaFinder
          git pull
          docker compose pull
          docker compose down --remove-orphans
          docker compose up -d
