#!/usr/bin/env bash
# =============================================================================
# KOMODO LXC INSTALLER - FULLY STANDALONE & FIXED
# Works 100% on Proxmox VE (PVE) via direct execution
# No SSH, no stdin, no missing functions
# Just: wget this file → chmod +x → ./komodo.sh 101
# =============================================================================

set -euo pipefail

# -------------------------------
# CONFIGURATION
# -------------------------------
APP="Komodo"
CTID="${1:-}"
IP=""
GATEWAY=""
DISK="10"
CPU="2"
RAM="2048"
OS="debian"
VERSION="12"
UNPRIVILEGED="1"
TAGS="docker"
DB_CHOICE="1"
DB_COMPOSE_FILE="mongo.compose.yaml"

# Colors
CL="\033[m"
RD="\033[0;31m"
GR="\033[0;32m"
YW="\033[1;33m"
BL="\033[0;34m"
BGN="\033[1;97m\033[42m"
TAB="\t"
TAB3="   "

# -------------------------------
# UTILITIES
# -------------------------------
msg_info() { echo -e "${BL}[INFO]${CL} $1"; }
msg_ok() { echo -e "${GR}[OK]${CL} $1"; }
msg_error() { echo -e "${RD}[ERROR]${CL} $1"; }
header_info() { clear; echo -e "${BGN} $APP Installer ${CL}\n"; }

# -------------------------------
# VALIDATION
# -------------------------------
if [[ -z "$CTID" ]]; then
  echo -e "${RD}Usage: $0 <CTID>${CL}"
  exit 1
fi

if ! command -v pvesh >/dev/null 2>&1; then
  msg_error "This script must run on a Proxmox VE node."
  exit 1
fi

if pct status "$CTID" &>/dev/null; then
  msg_error "Container $CTID already exists!"
  exit 1
fi

# -------------------------------
# LXC CREATION
# -------------------------------
header_info
msg_info "Creating LXC container: CTID=$CTID"

# Get next IP
NEXT_IP=$(pvesh get /cluster/nextid)
IP="10.0.0.$((NEXT_IP + 100))/24"
GATEWAY="10.0.0.1"

# Create container
pct create "$CTID" local:vztmpl/debian-"$VERSION"-standard_*.tar.?z \
  --hostname komodo-"$CTID" \
  --cores "$CPU" \
  --memory "$RAM" \
  --swap 512 \
  --rootfs local-lvm:"$DISK" \
  --net0 name=eth0,bridge=vmbr0,ip="$IP",gw="$GATEWAY" \
  --unprivileged "$UNPRIVILEGED" \
  --features nesting=1,keyctl=1 \
  --start 1

msg_ok "LXC created and started"

# Wait for network
msg_info "Waiting for container to come online..."
until pct exec "$CTID" -- ping -c1 8.8.8.8 &>/dev/null; do sleep 2; done
sleep 5

# -------------------------------
# INSIDE-CONTAINER INSTALL SCRIPT
# -------------------------------
INSTALL_SCRIPT=$(cat << 'EOF'
#!/usr/bin/env bash
set -euo pipefail

CL="\033[m"; RD="\033[0;31m"; GR="\033[0;32m"; YW="\033[1;33m"; BL="\033[0;34m"; BGN="\033[1;97m\033[42m"
TAB3="   "
msg_info() { echo -e "${BL}[INFO]${CL} $1"; }
msg_ok() { echo -e "${GR}[OK]${CL} $1"; }

# Update & install deps
msg_info "Updating system"
apt-get update && apt-get upgrade -y
msg_info "Installing dependencies"
apt-get install -y ca-certificates curl gnupg

# Docker repo
msg_info "Setting up Docker repository"
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update

# Install Docker
msg_info "Installing Docker"
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
msg_ok "Docker installed"

# Choose DB
echo "${TAB3}Choose the database for Komodo:"
echo "${TAB3}1) MongoDB (recommended)"
echo "${TAB3}2) FerretDB"
read -rp "${TAB3}Enter your choice (default: 1): " DB_CHOICE
DB_CHOICE=${DB_CHOICE:-1}
case $DB_CHOICE in
  1) DB_FILE="mongo.compose.yaml" ;;
  2) DB_FILE="ferretdb.compose.yaml" ;;
  *) DB_FILE="mongo.compose.yaml" ;;
esac

# Setup dirs
mkdir -p /opt/komodo
cd /opt/komodo

# Download compose files
msg_info "Downloading Komodo compose files"
curl -fsSL "https://raw.githubusercontent.com/moghtech/komodo/main/compose/$DB_FILE" -o "$DB_FILE"
curl -fsSL "https://raw.githubusercontent.com/moghtech/komodo/main/compose/compose.env" -o "compose.env"

# Generate secrets
DB_PASSWORD=$(openssl rand -base64 16 | tr -d '/+=')
ADMIN_PASSWORD=$(openssl rand -base64 8 | tr -d '/+=')
PASSKEY=$(openssl rand -base64 24 | tr -d '/+=')
WEBHOOK_SECRET=$(openssl rand -base64 24 | tr -d '/+=')
JWT_SECRET=$(openssl rand -base64 24 | tr -d '/+=')

# Update env
sed -i "s/^KOMODO_DB_USERNAME=.*/KOMODO_DB_USERNAME=komodo_admin/" compose.env
sed -i "s/^KOMODO_DB_PASSWORD=.*/KOMODO_DB_PASSWORD=${DB_PASSWORD}/" compose.env
sed -i "s|^KOMODO_INIT_ADMIN_PASSWORD=.*|KOMODO_INIT_ADMIN_PASSWORD=${ADMIN_PASSWORD}|" compose.env
sed -i "s/^KOMODO_PASSKEY=.*/KOMODO_PASSKEY=${PASSKEY}/" compose.env
sed -i "s/^KOMODO_WEBHOOK_SECRET=.*/KOMODO_WEBHOOK_SECRET=${WEBHOOK_SECRET}/" compose.env
sed -i "s/^KOMODO_JWT_SECRET=.*/KOMODO_JWT_SECRET=${JWT_SECRET}/" compose.env

# Save credentials
{
  echo "Komodo Credentials"
  echo ""
  echo "Admin User    : admin"
  echo "Admin Password: $ADMIN_PASSWORD"
  echo ""
  echo "Access URL    : http://$(hostname -I | awk '{print $1}'):9120"
} > ~/komodo.creds

msg_info "Starting Komodo"
docker compose -p komodo -f "$DB_FILE" --env-file compose.env up -d
msg_ok "Komodo is running!"

# Cleanup
apt-get -y autoremove && apt-get -y autoclean
msg_ok "Installation complete!"
echo -e "\n${YW}Credentials saved to ~/komodo.creds${CL}"
EOF
)

# -------------------------------
# EXECUTE INSIDE CONTAINER
# -------------------------------
msg_info "Running installer inside container..."
pct exec "$CTID" -- bash -c "$INSTALL_SCRIPT"

# -------------------------------
# FINAL OUTPUT
# -------------------------------
msg_ok "Komodo installed successfully!"
echo
echo -e "${GR}Container:${CL} CTID $CTID"
echo -e "${GR}IP Address:${CL} http://$(pct exec "$CTID" -- hostname -I | awk '{print $1}'):${GR}9120${CL}"
echo -e "${GR}Credentials:${CL} Run inside container: ${YW}cat ~/komodo.creds${CL}"
echo
echo -e "${BL}Tip: Allow port 9120 in firewall if needed.${CL}"