name: Build and Push Docker Images

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

jobs:
  paths-filter:
    runs-on: ubuntu-latest
    outputs:
      frontend: ${{ steps.filter.outputs.frontend }}
      api: ${{ steps.filter.outputs.api }}
      widget: ${{ steps.filter.outputs.widget }}
      nlu: ${{ steps.filter.outputs.nlu }}
    steps:
      - uses: actions/checkout@v4
      - name: Filter paths
        id: filter
        uses: dorny/paths-filter@v3
        with:
          filters: |
            frontend:
              - 'frontend/**'
            api:
              - 'api/**'
            widget:
              - 'widget/**'
            nlu:
              - 'nlu/**'

  build-and-push:
    runs-on: ubuntu-latest
    needs:
      - paths-filter
    steps:
      - name: Check out repository code
        uses: actions/checkout@v4

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to Docker Hub
        id: docker_login
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Build and push Frontend Docker image
        if: ${{ needs.paths-filter.outputs.frontend == 'true' }}
        uses: docker/build-push-action@v6
        with:
          context: ./
          file: ./frontend/Dockerfile
          platforms: linux/amd64,linux/arm64
          push: true
          target: production
          tags: hexastack/hexabot-ui:latest

      - name: Build and push API Docker image
        if: ${{ needs.paths-filter.outputs.api == 'true' }}
        uses: docker/build-push-action@v6
        with:
          context: ./api/
          target: production
          file: ./api/Dockerfile
          platforms: linux/amd64,linux/arm64
          push: true
          tags: hexastack/hexabot-api:latest

      - name: Build and push Widget Docker image
        if: ${{ needs.paths-filter.outputs.widget == 'true' }}
        uses: docker/build-push-action@v6
        with:
          context: ./widget/
          file: ./widget/Dockerfile
          platforms: linux/amd64,linux/arm64
          target: production
          push: true
          tags: hexastack/hexabot-widget:latest

      - name: Build and push NLU Docker image
        if: ${{ needs.paths-filter.outputs.nlu == 'true' }}
        uses: docker/build-push-action@v6
        with:
          context: ./nlu/
          file: ./nlu/Dockerfile
          platforms: linux/amd64,linux/arm64
          push: true
          tags: hexastack/hexabot-nlu:latest
