#!/bin/bash
set -euo pipefail
IFS=$'\n\t'

GIT_REMOTE_NAME="github"
REPO_NAME=$(basename "$(pwd)")
DEFAULT_NAME="Mark Randall Havens"
DEFAULT_EMAIL="mark.r.havens@gmail.com"

# ────────────────
# Logging Helpers
# ────────────────
info()  { echo -e "\e[1;34m[INFO]\e[0m $*"; }
warn()  { echo -e "\e[1;33m[WARN]\e[0m $*"; }
error() { echo -e "\e[1;31m[ERROR]\e[0m $*" >&2; exit 1; }

# ────────────────
# Git and GitHub CLI Setup
# ────────────────
info "Checking for required tools..."

if ! command -v git &>/dev/null; then
  info "Installing Git..."
  sudo apt update && sudo apt install git -y || error "Failed to install Git"
else
  info "Git already installed: $(git --version)"
fi

if ! command -v gh &>/dev/null; then
  info "Installing GitHub CLI..."
  sudo apt install curl -y
  curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
  sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg
  echo "deb [arch=$(dpkg --print-architecture)] signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg https://cli.github.com/packages stable main" | \
    sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
  sudo apt update && sudo apt install gh -y || error "Failed to install GitHub CLI"
else
  info "GitHub CLI already installed: $(gh --version | head -n 1)"
fi

# ────────────────
# GitHub Authentication
# ────────────────
if ! gh auth status &>/dev/null; then
  info "Authenticating GitHub CLI..."
  gh auth login || error "GitHub authentication failed"
else
  info "GitHub CLI authenticated."
fi

# ────────────────
# Git Identity
# ────────────────
USER_NAME=$(git config --global user.name || true)
USER_EMAIL=$(git config --global user.email || true)

if [[ -z "$USER_NAME" || -z "$USER_EMAIL" ]]; then
  git config --global user.name "$DEFAULT_NAME"
  git config --global user.email "$DEFAULT_EMAIL"
  info "Git identity set to: $DEFAULT_NAME <$DEFAULT_EMAIL>"
else
  info "Git identity already set to: $USER_NAME <$USER_EMAIL>"
fi

# ────────────────
# Ensure SSH Key Exists
# ────────────────
if [ ! -f "$HOME/.ssh/id_ed25519" ]; then
  warn "SSH key not found. Generating a new one..."
  read -rp "[PROMPT] Enter your GitHub email: " SSH_EMAIL
  ssh-keygen -t ed25519 -C "$SSH_EMAIL" -f "$HOME/.ssh/id_ed25519" -N ""
  eval "$(ssh-agent -s)"
  ssh-add "$HOME/.ssh/id_ed25519"
  info "Public key:"
  cat "$HOME/.ssh/id_ed25519.pub"
  info "Now adding key to GitHub..."
  gh ssh-key add "$HOME/.ssh/id_ed25519.pub" --title "$(hostname)" || warn "You may need to add it manually"
else
  info "SSH key already exists."
fi

# ────────────────
# Initialize Git Repo
# ────────────────
if [ ! -d ".git" ]; then
  info "Initializing Git repo..."
  git init
  git add .
  git commit -m "Initial commit" || warn "Nothing to commit"
else
  info "Git repo already initialized."
fi

# ────────────────
# Ensure First Commit
# ────────────────
if ! git rev-parse HEAD &>/dev/null; then
  git add .
  git commit -m "Initial commit" || warn "Nothing to commit"
fi

# ────────────────
# Setup GitHub Remote (SSH)
# ────────────────
USERNAME=$(gh api user | jq -r .login)
SSH_REMOTE_URL="git@github.com:$USERNAME/$REPO_NAME.git"

if ! git remote get-url "$GIT_REMOTE_NAME" &>/dev/null; then
  if gh repo view "$USERNAME/$REPO_NAME" &>/dev/null; then
    info "Linking to existing GitHub repo via SSH..."
    git remote add "$GIT_REMOTE_NAME" "$SSH_REMOTE_URL"
  else
    info "Creating GitHub repo..."
    gh repo create "$REPO_NAME" --public --source=. --remote="$GIT_REMOTE_NAME" --push || error "Failed to create GitHub repo"
  fi
else
  info "Remote '$GIT_REMOTE_NAME' already set."
  git remote set-url "$GIT_REMOTE_NAME" "$SSH_REMOTE_URL"
fi

# ────────────────
# Commit Changes
# ────────────────
if ! git diff --quiet || ! git diff --cached --quiet; then
  info "Changes detected — committing..."
  git add .
  git commit -m "Update: $(date '+%Y-%m-%d %H:%M:%S')" || warn "Nothing to commit"
else
  info "No uncommitted changes found."
fi

# ────────────────
# Push via SSH
# ────────────────
BRANCH=$(git rev-parse --abbrev-ref HEAD)

if ! git config --get branch."$BRANCH".remote &>/dev/null; then
  info "Setting upstream and pushing..."
  git push -u "$GIT_REMOTE_NAME" "$BRANCH" || error "Push failed"
else
  info "Pushing via SSH to '$GIT_REMOTE_NAME'..."
  git push "$GIT_REMOTE_NAME" "$BRANCH" || error "Push failed"
fi

info "✅ Sync complete: $SSH_REMOTE_URL"
