name: Deploy

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    container:
      image: catthehacker/ubuntu:act-latest
    steps:
      - name: Kaynak kodu çek
        uses: actions/checkout@v4

      - name: .env.production oluştur
        run: |
          cat > .env.production <<'EOF'
          BETTER_AUTH_SECRET=${{ secrets.BETTER_AUTH_SECRET }}
          BETTER_AUTH_URL=${{ secrets.BETTER_AUTH_URL }}
          NEXT_PUBLIC_APP_URL=${{ secrets.NEXT_PUBLIC_APP_URL }}
          GOOGLE_CLIENT_ID=${{ secrets.GOOGLE_CLIENT_ID }}
          GOOGLE_CLIENT_SECRET=${{ secrets.GOOGLE_CLIENT_SECRET }}
          RESEND_API_KEY=${{ secrets.RESEND_API_KEY }}
          EMAIL_FROM=${{ secrets.EMAIL_FROM }}
          IYZICO_API_KEY=${{ secrets.IYZICO_API_KEY }}
          IYZICO_SECRET_KEY=${{ secrets.IYZICO_SECRET_KEY }}
          IYZICO_BASE_URL=${{ secrets.IYZICO_BASE_URL }}
          OPENROUTER_API_KEY=${{ secrets.OPENROUTER_API_KEY }}
          OPENROUTER_MODEL=${{ secrets.OPENROUTER_MODEL }}
          EOF

      # BuildKit'te "docker build --memory" YOK SAYILIR (moby/buildkit#1362);
      # gerçek sınır ancak buildkitd'yi kendi cgroup'u olan bir container'da
      # (buildx docker-container driver) koşturarak konur. Böylece build OOM
      # olursa yalnızca builder container'ı ölür — uygulama + Gitea ayakta kalır
      # ve adım 35-90 dk sessiz kilitlenme yerine hızlı, görünür hata verir.
      #
      # Sınırlar container İLK oluşturulduğunda donar; değerleri değiştirmek için
      # önce: docker buildx rm sinirli && docker rm -f buildx_buildkit_sinirli0
      - name: Sınırlı builder hazırla
        run: |
          cat > buildkitd.toml <<'EOF'
          [worker.oci]
            enabled = true
            max-parallelism = 1
          EOF
          # Act container'ı her koşuda sıfırdan geldiği için client kaydı hep
          # yeniden oluşturulur; host'taki buildx_buildkit_sinirli0 container'ı
          # (ve build cache'i) varsa bootstrap'ta aynen yeniden kullanılır.
          docker buildx create --name sinirli \
            --driver docker-container \
            --driver-opt memory=2200m \
            --driver-opt memory-swap=4200m \
            --driver-opt cpu-quota=150000 \
            --buildkitd-config ./buildkitd.toml \
            2>/dev/null || true
          docker buildx inspect sinirli --bootstrap >/dev/null

      - name: Build (sınırlı builder)
        run: |
          docker compose -p kolaytercih build --builder sinirli
          # docker-container driver'da imajın daemon'a --load ile düştüğünü doğrula;
          # düşmediyse aynı cache'ten yeniden build edip elle yükle.
          docker image inspect kolaytercih-app >/dev/null 2>&1 || \
            docker buildx build --builder sinirli --load -t kolaytercih-app .

      - name: Deploy
        run: docker compose -p kolaytercih up -d --no-build --remove-orphans

      - name: Temizlik (başarısız build'de de çalışır)
        if: always()
        run: |
          docker image prune -f || true
          # sinirli builder'ın cache'ini 4 GB'ta tut (flag adı buildx sürümüne göre değişti)
          docker buildx prune --builder sinirli -f --max-used-space 4gb 2>/dev/null || \
            docker buildx prune --builder sinirli -f --keep-storage 4gb || true
          # eski varsayılan-builder cache artıkları
          docker builder prune -f --filter "until=72h" || true
