name: Docker Images

on:
  push:
    branches: [main]
    paths:
      - 'src/food-market.api/**'
      - 'src/food-market.web/**'
      - 'src/food-market.application/**'
      - 'src/food-market.domain/**'
      - 'src/food-market.infrastructure/**'
      - 'src/food-market.shared/**'
      - 'deploy/**'
      - '.github/workflows/docker.yml'
  workflow_dispatch:

permissions:
  contents: read
  packages: write

env:
  LOCAL_REGISTRY: 127.0.0.1:5001

jobs:
  api:
    name: API image
    runs-on: [self-hosted, linux]
    steps:
      - uses: actions/checkout@v4

      - name: Login to ghcr
        env:
          TOKEN: ${{ secrets.GITHUB_TOKEN }}
          ACTOR: ${{ github.actor }}
        run: |
          for i in 1 2 3 4 5; do
            if echo "$TOKEN" | docker login ghcr.io -u "$ACTOR" --password-stdin; then
              exit 0
            fi
            echo "login attempt $i failed, retrying in 15s"
            sleep 15
          done
          exit 1

      - name: Build + push api
        env:
          OWNER: ${{ github.repository_owner }}
          SHA: ${{ github.sha }}
        run: |
          docker build -f deploy/Dockerfile.api \
            -t $LOCAL_REGISTRY/food-market-api:$SHA \
            -t $LOCAL_REGISTRY/food-market-api:latest \
            -t ghcr.io/$OWNER/food-market-api:$SHA \
            -t ghcr.io/$OWNER/food-market-api:latest .

          # Push to LOCAL registry first (deploy depends on it) — it's on localhost, reliable.
          for tag in $SHA latest; do
            docker push $LOCAL_REGISTRY/food-market-api:$tag || { echo "local push $tag failed"; exit 1; }
          done

          # Push to ghcr.io as off-site backup. Flaky on KZ network — retry, but don't fail the job.
          for tag in $SHA latest; do
            for i in 1 2 3 4 5; do
              if docker push ghcr.io/$OWNER/food-market-api:$tag; then break; fi
              echo "ghcr push $tag attempt $i failed, retrying in 15s"
              sleep 15
              [ $i -eq 5 ] && echo "::warning::ghcr push $tag failed after 5 attempts — local registry still has the image"
            done
          done

  web:
    name: Web image
    runs-on: [self-hosted, linux]
    steps:
      - uses: actions/checkout@v4

      - name: Login to ghcr
        env:
          TOKEN: ${{ secrets.GITHUB_TOKEN }}
          ACTOR: ${{ github.actor }}
        run: |
          for i in 1 2 3 4 5; do
            if echo "$TOKEN" | docker login ghcr.io -u "$ACTOR" --password-stdin; then
              exit 0
            fi
            echo "login attempt $i failed, retrying in 15s"
            sleep 15
          done
          exit 1

      - name: Build + push web
        env:
          OWNER: ${{ github.repository_owner }}
          SHA: ${{ github.sha }}
        run: |
          docker build -f deploy/Dockerfile.web \
            -t $LOCAL_REGISTRY/food-market-web:$SHA \
            -t $LOCAL_REGISTRY/food-market-web:latest \
            -t ghcr.io/$OWNER/food-market-web:$SHA \
            -t ghcr.io/$OWNER/food-market-web:latest .

          for tag in $SHA latest; do
            docker push $LOCAL_REGISTRY/food-market-web:$tag || { echo "local push $tag failed"; exit 1; }
          done

          for tag in $SHA latest; do
            for i in 1 2 3 4 5; do
              if docker push ghcr.io/$OWNER/food-market-web:$tag; then break; fi
              echo "ghcr push $tag attempt $i failed, retrying in 15s"
              sleep 15
              [ $i -eq 5 ] && echo "::warning::ghcr push $tag failed after 5 attempts — local registry still has the image"
            done
          done
