name: Build and Push Docker Images

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

env:
  REGISTRY: privaterepo.sitaru.org
  BACKEND_IMAGE_NAME: ${{ gitea.repository }}-backend
  FRONTEND_IMAGE_NAME: ${{ gitea.repository }}-frontend
  PIPELINE_IMAGE_NAME: ${{ gitea.repository }}-pipeline

jobs:
  build-backend:
    name: Build Backend (FastAPI)
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          buildkitd-config-inline: |
            [registry."docker.io"]
              mirrors = ["10.0.1.224:6000"]
            [registry."10.0.1.224:6000"]
              http = true
              insecure = true

      - name: Log in to Gitea Container Registry
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ gitea.actor }}
          password: ${{ secrets.REGISTRY_TOKEN }}

      - name: Extract metadata for Backend Docker image
        id: meta-backend
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.REGISTRY }}/${{ env.BACKEND_IMAGE_NAME }}
          tags: |
            type=ref,event=branch
            type=ref,event=pr
            type=sha,prefix=backend-
            type=raw,value=latest,enable=${{ gitea.ref == 'refs/heads/main' }}

      - name: Build and push Backend Docker image
        uses: docker/build-push-action@v5
        with:
          context: .
          file: ./Dockerfile
          push: ${{ gitea.event_name != 'pull_request' }}
          tags: ${{ steps.meta-backend.outputs.tags }}
          labels: ${{ steps.meta-backend.outputs.labels }}
          cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.BACKEND_IMAGE_NAME }}:buildcache
          cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.BACKEND_IMAGE_NAME }}:buildcache,mode=max

  build-frontend:
    name: Build Frontend (Next.js)
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          buildkitd-config-inline: |
            [registry."docker.io"]
              mirrors = ["10.0.1.224:6000"]
            [registry."10.0.1.224:6000"]
              http = true
              insecure = true

      - name: Log in to Gitea Container Registry
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ gitea.actor }}
          password: ${{ secrets.REGISTRY_TOKEN }}

      - name: Extract metadata for Frontend Docker image
        id: meta-frontend
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.REGISTRY }}/${{ env.FRONTEND_IMAGE_NAME }}
          tags: |
            type=ref,event=branch
            type=ref,event=pr
            type=sha,prefix=frontend-
            type=raw,value=latest,enable=${{ gitea.ref == 'refs/heads/main' }}

      - name: Build and push Frontend Docker image
        uses: docker/build-push-action@v5
        with:
          context: ./nextjs-app
          file: ./nextjs-app/Dockerfile
          push: ${{ gitea.event_name != 'pull_request' }}
          tags: ${{ steps.meta-frontend.outputs.tags }}
          labels: ${{ steps.meta-frontend.outputs.labels }}
          build-args: |
            FASTAPI_URL=http://backend:80/api
          # Cache disabled due to registry size limits
          # cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.FRONTEND_IMAGE_NAME }}:buildcache
          # cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.FRONTEND_IMAGE_NAME }}:buildcache,mode=max

  build-pipeline:
    name: Build Pipeline (Meltano + dbt + Airflow)
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          buildkitd-config-inline: |
            [registry."docker.io"]
              mirrors = ["10.0.1.224:6000"]
            [registry."10.0.1.224:6000"]
              http = true
              insecure = true

      - name: Log in to Gitea Container Registry
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ gitea.actor }}
          password: ${{ secrets.REGISTRY_TOKEN }}

      - name: Extract metadata for Pipeline Docker image
        id: meta-pipeline
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.REGISTRY }}/${{ env.PIPELINE_IMAGE_NAME }}
          tags: |
            type=ref,event=branch
            type=ref,event=pr
            type=sha,prefix=pipeline-
            type=raw,value=latest,enable=${{ gitea.ref == 'refs/heads/main' }}

      - name: Build and push Pipeline Docker image
        uses: docker/build-push-action@v5
        with:
          context: ./pipeline
          file: ./pipeline/Dockerfile
          push: ${{ gitea.event_name != 'pull_request' }}
          tags: ${{ steps.meta-pipeline.outputs.tags }}
          labels: ${{ steps.meta-pipeline.outputs.labels }}
          cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.PIPELINE_IMAGE_NAME }}:buildcache
          cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.PIPELINE_IMAGE_NAME }}:buildcache,mode=max

  trigger-deployment:
    name: Trigger Portainer Update
    runs-on: ubuntu-latest
    needs: [build-backend, build-frontend, build-pipeline]
    if: gitea.event_name != 'pull_request'
    steps:
      - name: Trigger Portainer stack update
        run: |
          curl -X POST -k "https://10.0.1.224:9443/api/stacks/webhooks/863fc57c-bf24-4c63-9001-bdf9912fba73"
