#!/usr/bin/env bash
# =============================================================================
#  PragmaCloud — Instalacijska skripta za lokalni deployment
#  Podržani sistemi: Ubuntu 20.04+, Debian 11+
#  Upotreba: curl -sSL https://install.pragma.ba | bash
#         ili: bash install.sh
# =============================================================================
set -euo pipefail

# ── Konstante ─────────────────────────────────────────────────────────────────
PRAGMA_DIR="/opt/pragma"
DATA_DIR="${PRAGMA_DIR}/tabele"
APP_DIR="${PRAGMA_DIR}/app"
IMAGE="ghcr.io/slavkomatanovic/pragmacloud:latest"
COMPOSE_URL="https://pragma.ba/download/docker-compose.client.yml"
MIN_DOCKER_VERSION="24.0"
MIN_RAM_MB=512

# ── Boje ──────────────────────────────────────────────────────────────────────
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'
BLUE='\033[0;34m'; BOLD='\033[1m'; NC='\033[0m'

info()    { echo -e "${BLUE}→${NC} $*"; }
success() { echo -e "${GREEN}✓${NC} $*"; }
warn()    { echo -e "${YELLOW}!${NC} $*"; }
error()   { echo -e "${RED}✗${NC} $*" >&2; exit 1; }
header()  { echo -e "\n${BOLD}${BLUE}$*${NC}"; echo "──────────────────────────────────────────"; }

# ── Provjera root ─────────────────────────────────────────────────────────────
if [[ $EUID -ne 0 ]]; then
  error "Pokrenite skriptu kao root: sudo bash install.sh"
fi

header "PragmaCloud Instalacija"
echo "Ova skripta instalira PragmaCloud lokalno koristeći Docker."
echo ""

# ── Provjera OS-a ─────────────────────────────────────────────────────────────
if ! grep -qiE "ubuntu|debian" /etc/os-release 2>/dev/null; then
  warn "Ovaj OS nije testiran. Nastaviti? [y/N]"
  read -r confirm; [[ "$confirm" =~ ^[yY] ]] || exit 0
fi

# ── Provjera RAM-a ────────────────────────────────────────────────────────────
TOTAL_RAM_MB=$(awk '/MemTotal/ {print int($2/1024)}' /proc/meminfo)
if [[ $TOTAL_RAM_MB -lt $MIN_RAM_MB ]]; then
  warn "Sistem ima samo ${TOTAL_RAM_MB}MB RAM. Preporučeno je minimum ${MIN_RAM_MB}MB."
fi

# ── Provjera i instalacija Dockera ───────────────────────────────────────────
header "1. Docker"
if command -v docker &>/dev/null; then
  DOCKER_VER=$(docker --version | grep -oP '\d+\.\d+' | head -1)
  success "Docker ${DOCKER_VER} je već instaliran."
else
  info "Docker nije pronađen. Instalacija..."
  apt-get update -q
  apt-get install -y -q ca-certificates curl gnupg lsb-release
  install -m 0755 -d /etc/apt/keyrings
  curl -fsSL https://download.docker.com/linux/$(. /etc/os-release && echo "$ID")/gpg \
    | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  chmod a+r /etc/apt/keyrings/docker.gpg
  echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
    https://download.docker.com/linux/$(. /etc/os-release && echo "$ID") \
    $(lsb_release -cs) stable" \
    > /etc/apt/sources.list.d/docker.list
  apt-get update -q
  apt-get install -y -q docker-ce docker-ce-cli containerd.io docker-compose-plugin
  systemctl enable --now docker
  success "Docker instaliran."
fi

if ! command -v docker compose &>/dev/null && ! command -v docker-compose &>/dev/null; then
  error "docker compose plugin nije dostupan. Instalirajte ga ručno."
fi

# ── Kreiranje direktorija ─────────────────────────────────────────────────────
header "2. Direktoriji"
mkdir -p "$DATA_DIR" "$APP_DIR"
chmod 755 "$DATA_DIR" "$APP_DIR"
success "Kreiran: ${DATA_DIR}"
success "Kreiran: ${APP_DIR}"

# ── Konfiguracija ─────────────────────────────────────────────────────────────
header "3. Konfiguracija"

ENV_FILE="${APP_DIR}/.env"

# Ako .env već postoji, pitaj korisnika
if [[ -f "$ENV_FILE" ]]; then
  warn ".env fajl već postoji u ${APP_DIR}."
  echo -n "  Prepisati ga? [y/N] "
  read -r overwrite
  if [[ ! "$overwrite" =~ ^[yY] ]]; then
    info "Konfiguracija zadržana."
  else
    rm "$ENV_FILE"
  fi
fi

if [[ ! -f "$ENV_FILE" ]]; then
  # Port
  echo ""
  echo -n "  Port na koji PragmaCloud treba slušati [8080]: "
  read -r APP_PORT
  APP_PORT="${APP_PORT:-8080}"

  # Licencni ključ
  echo ""
  echo -n "  Unesite licencni ključ (dobijate od Pragma tima): "
  read -r LICENSE_KEY
  if [[ -z "$LICENSE_KEY" ]]; then
    warn "Licencni ključ nije unesen. Aplikacija će raditi u demo/trial modu."
    LICENSE_KEY="TRIAL"
  fi

  # Firma naziv (opcionalno, za display)
  echo ""
  echo -n "  Naziv firme (opcionalno, za prikaz): "
  read -r FIRMA_NAZIV
  FIRMA_NAZIV="${FIRMA_NAZIV:-}"

  cat > "$ENV_FILE" << EOF
# PragmaCloud — lokalna konfiguracija
# Kreirano: $(date '+%Y-%m-%d %H:%M')

# Port na hostu
APP_PORT=${APP_PORT}

# Folder s SQLite bazama
SQLITE_DIR=${DATA_DIR}

# Licencni ključ
PRAGMA_LICENSE_KEY=${LICENSE_KEY}

# Firma (opcionalno)
# PRAGMA_FIRMA_NAZIV=${FIRMA_NAZIV}

# Email notifikacije (opcionalno)
# Email__SmtpHost=smtp.gmail.com
# Email__SmtpPort=587
# Email__Username=
# Email__Password=
# Email__From=
EOF
  success ".env kreiran: ${ENV_FILE}"
fi

# ── Preuzimanje docker-compose.client.yml ─────────────────────────────────────
header "4. Docker Compose"
COMPOSE_FILE="${APP_DIR}/docker-compose.yml"

if [[ ! -f "$COMPOSE_FILE" ]]; then
  info "Preuzimanje docker-compose.client.yml..."
  if command -v curl &>/dev/null; then
    curl -sSL "$COMPOSE_URL" -o "$COMPOSE_FILE" \
      || { warn "Preuzimanje nije uspjelo. Kopiram lokalni fajl..."; cp "$(dirname "$0")/docker-compose.client.yml" "$COMPOSE_FILE" 2>/dev/null || error "docker-compose.client.yml nije pronađen."; }
  else
    cp "$(dirname "$0")/docker-compose.client.yml" "$COMPOSE_FILE" 2>/dev/null \
      || error "Nije moguće pronaći docker-compose.client.yml. Potrebna internet konekcija ili lokalni fajl."
  fi
  success "docker-compose.yml kreiran: ${COMPOSE_FILE}"
else
  success "docker-compose.yml već postoji."
fi

# ── GHCR login (ako je repo privatan) ─────────────────────────────────────────
header "5. Docker registry"
# Pokušaj pull bez login-a (funkcionira za javni repo)
info "Provjera pristupa GHCR-u..."
if ! docker pull "$IMAGE" --quiet 2>/dev/null; then
  warn "Nije moguće preuzeti image bez autentifikacije."
  echo ""
  echo "  Unesite GitHub Personal Access Token (PAT) za pristup GHCR-u."
  echo "  Token treba imati read:packages dozvolu."
  echo -n "  GitHub korisničko ime: "
  read -r GHCR_USER
  echo -n "  GitHub PAT token: "
  read -rs GHCR_TOKEN; echo ""
  echo "$GHCR_TOKEN" | docker login ghcr.io -u "$GHCR_USER" --password-stdin \
    || error "GHCR login nije uspio. Provjerite korisničko ime i token."
  success "Prijavljen na GHCR."

  # Spremi credentials za Watchtower
  mkdir -p /root/.docker
  info "Docker config sačuvan za Watchtower (auto-update)."
fi

# ── Pokretanje ────────────────────────────────────────────────────────────────
header "6. Pokretanje aplikacije"
cd "$APP_DIR"

info "Povlačenje Docker image-a (može potrajati pri prvom pokretanju)..."
docker compose pull

info "Pokretanje kontejnera..."
docker compose up -d

# Čekanje na healthcheck
info "Čekanje da se aplikacija pokrene..."
TIMEOUT=60; ELAPSED=0
while [[ $ELAPSED -lt $TIMEOUT ]]; do
  STATUS=$(docker inspect --format='{{.State.Health.Status}}' pragmacloud 2>/dev/null || echo "starting")
  if [[ "$STATUS" == "healthy" ]]; then
    break
  fi
  sleep 3; ELAPSED=$((ELAPSED + 3))
  echo -n "."
done
echo ""

if [[ "$STATUS" == "healthy" ]]; then
  success "PragmaCloud je pokrenut i zdrav!"
else
  warn "Aplikacija možda još nije sprema (status: ${STATUS}). Provjerite logove: docker logs pragmacloud"
fi

# ── Kreiranje systemd servisa (opcionalno) ─────────────────────────────────────
header "7. Autostart pri pokretanju servera"
SYSTEMD_FILE="/etc/systemd/system/pragmacloud.service"
if [[ ! -f "$SYSTEMD_FILE" ]]; then
  cat > "$SYSTEMD_FILE" << EOF
[Unit]
Description=PragmaCloud ERP
After=docker.service
Requires=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=${APP_DIR}
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
TimeoutStartSec=120

[Install]
WantedBy=multi-user.target
EOF
  systemctl daemon-reload
  systemctl enable pragmacloud.service
  success "Systemd servis kreiran — PragmaCloud će se automatski pokrenuti pri restartu servera."
else
  info "Systemd servis već postoji."
fi

# ── Finalni izvještaj ─────────────────────────────────────────────────────────
PORT=$(grep "^APP_PORT" "$ENV_FILE" | cut -d= -f2 | tr -d ' ' || echo "8080")
LOCAL_IP=$(hostname -I | awk '{print $1}')

echo ""
echo -e "${GREEN}${BOLD}════════════════════════════════════════════════${NC}"
echo -e "${GREEN}${BOLD}  PragmaCloud je uspješno instaliran!  🎉${NC}"
echo -e "${GREEN}${BOLD}════════════════════════════════════════════════${NC}"
echo ""
echo -e "  ${BOLD}Lokalni pristup:${NC}    http://localhost:${PORT}"
echo -e "  ${BOLD}Mrežni pristup:${NC}     http://${LOCAL_IP}:${PORT}"
echo ""
echo -e "  ${BOLD}Baze podataka:${NC}      ${DATA_DIR}"
echo -e "  ${BOLD}Konfiguracija:${NC}      ${ENV_FILE}"
echo ""
echo -e "  ${BOLD}Korisne komande:${NC}"
echo -e "    docker logs pragmacloud          # logovi aplikacije"
echo -e "    docker compose -f ${APP_DIR}/docker-compose.yml ps    # status"
echo -e "    systemctl restart pragmacloud    # restart"
echo ""
echo -e "${YELLOW}  Backup:${NC} Redovno kopirajte ${DATA_DIR} na sigurnu lokaciju!"
echo ""
