#!/usr/bin/env bash
# keygen.sh — gera o par de chaves usado pelo SSHepherd.
#
# Roda na máquina LOCAL. Nunca sobrescreve chave existente (EC-06 da spec do Dia Zero).
# A chave privada nunca e exibida: só a pública vai para a tela.
#
# Uso: keygen.sh --name <identificador> [--dir ~/.ssh] [--reuse]

set -euo pipefail

NAME=""
SSH_DIR="${HOME}/.ssh"
REUSE=0

while [ $# -gt 0 ]; do
  case "$1" in
    --name)  NAME="$2"; shift 2 ;;
    --dir)   SSH_DIR="$2"; shift 2 ;;
    --reuse) REUSE=1; shift ;;
    *) echo "argumento desconhecido: $1" >&2; exit 2 ;;
  esac
done

[ -n "$NAME" ] || { echo "ERRO: --name é obrigatório" >&2; exit 2; }

SAFE_NAME=$(printf '%s' "$NAME" | tr -c 'a-zA-Z0-9_-' '-' | sed 's/-\{2,\}/-/g; s/^-//; s/-$//')
KEY_PATH="${SSH_DIR}/sshepherd_${SAFE_NAME}_ed25519"

mkdir -p "$SSH_DIR"
chmod 700 "$SSH_DIR" 2>/dev/null || true

if [ -f "$KEY_PATH" ]; then
  if [ "$REUSE" -eq 1 ]; then
    echo "REUTILIZANDO chave existente."
  else
    echo "ERRO: já existe uma chave em ${KEY_PATH}" >&2
    echo "Use --reuse para reaproveita-la, ou --name com outro identificador." >&2
    exit 3
  fi
else
  # Sem frase secreta: o framework precisa conectar sem interacao.
  # A proteção vem da permissão do arquivo e do desligamento de senha no servidor.
  ssh-keygen -t ed25519 -a 100 -N '' -C "sshepherd-${SAFE_NAME}" -f "$KEY_PATH" >/dev/null
  echo "Chave criada."
fi

chmod 600 "$KEY_PATH" 2>/dev/null || true
chmod 644 "${KEY_PATH}.pub" 2>/dev/null || true

echo ""
echo "Caminho da chave privada (nunca compartilhe, nunca abra):"
echo "  ${KEY_PATH}"
echo ""
echo "Chave PUBLICA — esta é a que você cola no painel do provedor:"
echo "--------------------------------------------------------------"
cat "${KEY_PATH}.pub"
echo "--------------------------------------------------------------"
echo ""
echo "KEY_PATH=${KEY_PATH}"
