#!/usr/bin/env bash
# BarbarosTech – Geliştirici VDS kurulum scripti: ci-runner
# Kaynak: https://barbarostech.com/kurulum/ci-runner.sh — çalıştırmadan önce inceleyebilirsiniz.
# Ubuntu 20.04+ / Debian 11+ içindir. Altyapı: BarbarosTech, yazılım: ilgili projelerin resmi kaynakları.

set -Eeuo pipefail
G='\033[1;32m'; Y='\033[1;33m'; R='\033[1;31m'; B='\033[1m'; N='\033[0m'
log()  { printf '%b==>%b %s\n' "$G" "$N" "$*"; }
warn() { printf '%bUyarı:%b %s\n' "$Y" "$N" "$*"; }
die()  { printf '%bHata:%b %s\n' "$R" "$N" "$*" >&2; exit 1; }
trap 'die "Kurulum ${LINENO}. satırda durdu. Çıktıyı kontrol edin; yardım için WhatsApp: +90 541 761 60 77"' ERR

[ "$(id -u)" -eq 0 ] || die "Bu script root olarak çalıştırılmalı. Komutun başına sudo ekleyin."
[ -r /etc/os-release ] || die "İşletim sistemi tespit edilemedi."
# shellcheck disable=SC1091
. /etc/os-release
case "${ID:-}" in
  ubuntu|debian) ;;
  *) die "Bu script yalnızca Ubuntu ve Debian'da çalışır (bulunan: ${ID:-bilinmiyor})." ;;
esac
export DEBIAN_FRONTEND=noninteractive

apt_install() { apt-get update -qq; apt-get install -y -qq "$@" >/dev/null; }

install_docker() {
  if command -v docker >/dev/null 2>&1; then
    log "Docker zaten kurulu: $(docker --version)"
  else
    log "Docker kuruluyor (resmi get.docker.com scripti)..."
    curl -fsSL https://get.docker.com | sh >/dev/null
  fi
  systemctl enable --now docker >/dev/null 2>&1 || true
}

port_busy() { ss -ltnH "sport = :$1" 2>/dev/null | grep -q .; }

public_ip() { curl -fsS4 --max-time 5 https://api.ipify.org 2>/dev/null || hostname -I | awk '{print $1}'; }

# Kullanım:
#   GitHub : curl -fsSL https://barbarostech.com/kurulum/ci-runner.sh | sudo bash -s -- github https://github.com/KULLANICI/DEPO TOKEN
#   GitLab : curl -fsSL https://barbarostech.com/kurulum/ci-runner.sh | sudo bash -s -- gitlab https://gitlab.com TOKEN
# GitHub TOKEN: Depo → Settings → Actions → Runners → New self-hosted runner sayfasındaki kayıt token'ı.
# GitLab TOKEN: Proje → Settings → CI/CD → Runners → New project runner ile alınan glrt-... token'ı.
# Ayarlar (isteğe bağlı): RUNNER_NAME=$(hostname)  RUNNER_LABELS=etiket1,etiket2  RUNNER_USER=runner  DOCKER_IMAGE=alpine:latest

MODE="${1:-}"; URL="${2:-}"; TOKEN="${3:-}"
RUNNER_NAME="${RUNNER_NAME:-$(hostname)}"
{ [ -n "$MODE" ] && [ -n "$URL" ] && [ -n "$TOKEN" ]; } || die "Kullanım: ... | sudo bash -s -- github|gitlab <URL> <TOKEN>"
[[ "$URL" =~ ^https:// ]] || die "URL https:// ile başlamalı: $URL"
case "$MODE" in github|gitlab) ;; *) die "İlk parametre github veya gitlab olmalı." ;; esac

log "Gerekli paketler kuruluyor..."
apt_install sudo curl ca-certificates git jq tar
install_docker

case "$MODE" in
  github)
    RUSER="${RUNNER_USER:-runner}"
    case "$(uname -m)" in
      x86_64) ARCH=x64 ;; aarch64) ARCH=arm64 ;; *) die "Desteklenmeyen mimari: $(uname -m)" ;;
    esac
    id "$RUSER" >/dev/null 2>&1 || adduser --disabled-password --gecos "" "$RUSER" >/dev/null
    usermod -aG docker "$RUSER"
    RHOME="$(getent passwd "$RUSER" | cut -d: -f6)"
    DIR="$RHOME/actions-runner"
    if [ -e "$DIR/.runner" ]; then die "$DIR içinde zaten kayıtlı bir runner var."; fi
    VER="$(curl -fsSL https://api.github.com/repos/actions/runner/releases/latest | jq -r .tag_name | sed 's/^v//')"
    [ -n "$VER" ] && [ "$VER" != "null" ] || die "GitHub runner sürümü alınamadı."
    log "GitHub Actions runner $VER indiriliyor..."
    sudo -u "$RUSER" mkdir -p "$DIR"
    cd "$DIR"
    sudo -u "$RUSER" curl -fsSL -o runner.tar.gz "https://github.com/actions/runner/releases/download/v${VER}/actions-runner-linux-${ARCH}-${VER}.tar.gz"
    sudo -u "$RUSER" tar xzf runner.tar.gz
    rm -f runner.tar.gz
    ./bin/installdependencies.sh >/dev/null
    log "Runner deponuza kaydediliyor..."
    LABEL_ARGS=()
    if [ -n "${RUNNER_LABELS:-}" ]; then LABEL_ARGS=(--labels "$RUNNER_LABELS"); fi
    sudo -u "$RUSER" ./config.sh --unattended --url "$URL" --token "$TOKEN" --name "$RUNNER_NAME" --replace "${LABEL_ARGS[@]}"
    ./svc.sh install "$RUSER" >/dev/null
    ./svc.sh start >/dev/null
    printf '\n%bKurulum tamamlandı.%b\n' "$B" "$N"
    echo "  Runner    : $RUNNER_NAME (kullanıcı: $RUSER, klasör: $DIR)"
    echo "  Workflow  : runs-on: self-hosted"
    echo "  Durum     : cd $DIR && sudo ./svc.sh status"
    ;;
  gitlab)
    log "GitLab Runner deposu ekleniyor..."
    curl -fsSL "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | bash >/dev/null
    apt_install gitlab-runner
    log "Runner GitLab'a kaydediliyor (executor: docker)..."
    gitlab-runner register --non-interactive --url "$URL" --token "$TOKEN" \
      --executor docker --docker-image "${DOCKER_IMAGE:-alpine:latest}"
    systemctl enable --now gitlab-runner >/dev/null 2>&1 || true
    printf '\n%bKurulum tamamlandı.%b\n' "$B" "$N"
    echo "  Durum     : sudo gitlab-runner status  |  sudo gitlab-runner list"
    ;;
  *) die "İlk parametre github veya gitlab olmalı." ;;
esac
echo "  Not       : Self-hosted runner'ları yalnızca özel (private) depolarda kullanın."
