#!/usr/bin/env bash
# GitHub'dan güncelleme script'i
# Kullanım:
#   ./update.sh                 -> soft pull (yerel değişiklikler korunur)
#   ./update.sh hard            -> hard reset (yerel silinir, remote ile birebir)
#   ./update.sh setup <TOKEN>   -> origin URL'ine token gömer (tek seferlik)
#   ./update.sh status          -> repo durumunu göster

set -euo pipefail

cd "$(dirname "$0")"

MODE="${1:-soft}"
REMOTE="origin"

# setup ve status branch bilgisi olmadan da çalışmalı, sıraya dikkat
case "$MODE" in
  setup)
    TOKEN="${2:-}"
    if [ -z "$TOKEN" ]; then
      echo "Kullanım: ./update.sh setup <github_pat_...>"
      exit 1
    fi
    CURRENT_URL="$(git remote get-url "$REMOTE")"
    # https://github.com/... veya https://TOKEN@github.com/... biçimini yakala
    NEW_URL="$(echo "$CURRENT_URL" | sed -E 's#https://([^@]*@)?github\.com/#https://'"$TOKEN"'@github.com/#')"
    git remote set-url "$REMOTE" "$NEW_URL"
    # Token'ı log'lamayalım, sadece doğrulayalım
    if git ls-remote "$REMOTE" HEAD >/dev/null 2>&1; then
      echo "✓ Token kuruldu, remote erişimi doğrulandı."
    else
      echo "⚠ Token kuruldu ama remote erişimi başarısız. Token yetkilerini kontrol et."
      exit 1
    fi
    exit 0
    ;;
  status)
    git fetch "$REMOTE" --quiet
    git status -sb
    echo
    git log --oneline -5
    exit 0
    ;;
esac

BRANCH="$(git rev-parse --abbrev-ref HEAD)"

echo "→ Repo:   $(basename "$PWD")"
echo "→ Branch: $BRANCH"
echo "→ Mod:    $MODE"
echo

git fetch "$REMOTE" "$BRANCH"

case "$MODE" in
  soft)
    STASHED=0
    if ! git diff --quiet || ! git diff --cached --quiet; then
      echo "→ Yerel değişiklikler bulundu, stash'leniyor..."
      git stash push -u -m "update.sh auto-stash $(date +%Y%m%d-%H%M%S)"
      STASHED=1
    fi

    echo "→ git pull --rebase $REMOTE $BRANCH"
    git pull --rebase "$REMOTE" "$BRANCH"

    if [ "$STASHED" -eq 1 ]; then
      echo "→ Stash geri uygulanıyor..."
      if ! git stash pop; then
        echo
        echo "⚠ Conflict oluştu. Çözüm:"
        echo "   1) Çakışan dosyaları düzenleyip kaydet"
        echo "   2) git add <dosya>"
        echo "   3) git stash drop   (stash hâlâ listede: git stash list)"
        exit 1
      fi
    fi
    echo
    echo "✓ Soft pull tamam."
    ;;

  hard|force)
    echo "⚠ DİKKAT: Commit'lenmemiş tüm yerel değişiklikler ve takip edilmeyen dosyalar SİLİNECEK."
    read -r -p "Devam etmek istiyor musun? (y/N): " confirm
    if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
      echo "İptal edildi."
      exit 0
    fi

    echo "→ git reset --hard $REMOTE/$BRANCH"
    git reset --hard "$REMOTE/$BRANCH"

    echo "→ git clean -fd (takip edilmeyen dosyaları sil)"
    git clean -fd
    echo
    echo "✓ Hard pull tamam. Branch remote ile birebir."
    ;;

  *)
    echo "Geçersiz mod: $MODE"
    echo "Kullanım: ./update.sh [soft|hard|setup <TOKEN>|status]"
    exit 1
    ;;
esac
