#!/bin/bash
# ═══════════════════════════════════════════════════════════
#  O11 PRO OTT STREAMER V2 — Installer / Uninstaller
# ═══════════════════════════════════════════════════════════

set -e

# ── Colors ────────────────────────────────────────────────
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
MAGENTA='\033[0;35m'
WHITE='\033[1;37m'
GRAY='\033[0;90m'
BOLD='\033[1m'
DIM='\033[2m'
RESET='\033[0m'

# ── Variables ─────────────────────────────────────────────
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BINARY_NAME="o11pro"
BINARY_PATH="${SCRIPT_DIR}/${BINARY_NAME}"
SERVICE_NAME="o11pro"
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
PORT=2500
EXTRA_ARGS=""
USERNAME="admin"
PASSWORD="admin"

# ── Banner ────────────────────────────────────────────────
show_banner() {
    clear
    echo ""
    echo -e "  ${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}"
    echo -e "  ${WHITE}${BOLD}  O11 PRO${RESET} ${CYAN}│${RESET} ${YELLOW}OTT Streamer${RESET}"
    echo -e "  ${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}"
    echo ""
}

# ── Detect OS ─────────────────────────────────────────────
detect_os() {
    if [[ -f /etc/os-release ]]; then
        . /etc/os-release
        OS_PRETTY="${PRETTY_NAME}"
    elif [[ -f /etc/redhat-release ]]; then
        OS_PRETTY="$(cat /etc/redhat-release)"
    elif [[ -f /etc/debian_version ]]; then
        OS_PRETTY="Debian $(cat /etc/debian_version)"
    else
        OS_PRETTY="Unknown Linux"
    fi

    echo -e "  ${GRAY}┌─────────────────────────────────────────────┐${RESET}"
    echo -e "  ${GRAY}│${RESET} ${WHITE}OS${RESET}     ${OS_PRETTY}$(printf '%*s' $((39 - ${#OS_PRETTY})) '')${GRAY}│${RESET}"
    echo -e "  ${GRAY}│${RESET} ${WHITE}Arch${RESET}   $(uname -m) │ ${WHITE}Kernel${RESET} $(uname -r)$(printf '%*s' $((22 - ${#ARCH_K})) '')${GRAY}│${RESET}"
    echo -e "  ${GRAY}│${RESET} ${WHITE}Path${RESET}   ${SCRIPT_DIR}$(printf '%*s' $((39 - ${#SCRIPT_DIR})) '')${GRAY}│${RESET}"
    echo -e "  ${GRAY}└─────────────────────────────────────────────┘${RESET}"
    echo ""
}

# ── Get Server IP ─────────────────────────────────────────
get_server_ip() {
    local public_ip=""
    public_ip=$(curl -s --connect-timeout 3 https://ifconfig.me 2>/dev/null || \
                curl -s --connect-timeout 3 https://api.ipify.org 2>/dev/null || \
                curl -s --connect-timeout 3 https://icanhazip.com 2>/dev/null || true)

    if [[ -n "$public_ip" ]]; then
        SERVER_IP="$public_ip"
    else
        SERVER_IP=$(hostname -I 2>/dev/null | awk '{print $1}')
        [[ -z "$SERVER_IP" ]] && SERVER_IP="127.0.0.1"
    fi
}

# ── Check Root ────────────────────────────────────────────
check_root() {
    if [[ $EUID -ne 0 ]]; then
        echo -e "  ${RED}✗ Run as root:${RESET} sudo $0"
        exit 1
    fi
}

# ── Configure Options ────────────────────────────────────
configure_options() {
    # ── Port ──
    echo -e "  ${WHITE}${BOLD}Port Configuration${RESET}"
    echo -ne "  Set custom port? ${GRAY}[default: ${PORT}]${RESET} (y/N): "
    read -r set_port

    if [[ "$set_port" =~ ^[Yy]$ ]]; then
        echo -ne "  Enter port: "
        read -r custom_port
        if [[ "$custom_port" =~ ^[0-9]+$ ]] && (( custom_port > 0 && custom_port < 65536 )); then
            PORT="$custom_port"
            echo -e "  ${GREEN}✓${RESET} Port set to ${WHITE}${PORT}${RESET}"
        else
            echo -e "  ${YELLOW}⚠${RESET} Invalid port — using default ${PORT}"
        fi
    fi
    echo ""

    # ── Extra Arguments ──
    echo -e "  ${WHITE}${BOLD}Extra Arguments${RESET}"
    echo -e "  ${GRAY}Examples: -c myconfig.cfg -keys keys.txt -headless${RESET}"
    echo -ne "  Add extra arguments? (y/N): "
    read -r set_args

    if [[ "$set_args" =~ ^[Yy]$ ]]; then
        echo -ne "  Arguments: "
        read -r custom_args
        if [[ -n "$custom_args" ]]; then
            EXTRA_ARGS="$custom_args"
            echo -e "  ${GREEN}✓${RESET} Extra args: ${WHITE}${EXTRA_ARGS}${RESET}"
        fi
    fi
    echo ""

    # Build final command
    EXEC_CMD="${BINARY_PATH} -p ${PORT}"
    if [[ -n "$EXTRA_ARGS" ]]; then
        EXEC_CMD="${EXEC_CMD} ${EXTRA_ARGS}"
    fi
}

# ── Install ───────────────────────────────────────────────
do_install() {
    echo -e "  ${CYAN}${BOLD}▸ Installing O11 PRO OTT Streamer${RESET}"
    echo ""

    # Check binary
    if [[ ! -f "$BINARY_PATH" ]]; then
        echo -e "  ${RED}✗ Binary not found:${RESET} ${BINARY_PATH}"
        exit 1
    fi

    # Configure port & arguments
    configure_options

    # Make binary executable
    chmod +x "$BINARY_PATH"
    echo -e "  ${GREEN}✓${RESET} Binary ready"

    # Stop if already running
    if systemctl is-active --quiet "${SERVICE_NAME}" 2>/dev/null; then
        echo -e "  ${YELLOW}⚠${RESET} Stopping existing service..."
        systemctl stop "${SERVICE_NAME}" 2>/dev/null || true
    fi

    # Create systemd service
    cat > "$SERVICE_FILE" <<EOF
[Unit]
Description=O11 PRO OTT Streamer
After=network.target network-online.target
Wants=network-online.target

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=${SCRIPT_DIR}
ExecStart=${EXEC_CMD}
Restart=always
RestartSec=5
LimitNOFILE=65536
LimitNPROC=65536
StandardOutput=journal
StandardError=journal
SyslogIdentifier=${SERVICE_NAME}

[Install]
WantedBy=multi-user.target
EOF

    echo -e "  ${GREEN}✓${RESET} Service created"

    systemctl daemon-reload
    echo -e "  ${GREEN}✓${RESET} Daemon reloaded"

    systemctl enable "${SERVICE_NAME}" >/dev/null 2>&1
    echo -e "  ${GREEN}✓${RESET} Enabled at boot"

    systemctl start "${SERVICE_NAME}"
    sleep 2

    if systemctl is-active --quiet "${SERVICE_NAME}"; then
        echo -e "  ${GREEN}✓${RESET} Service running"
    else
        echo -e "  ${RED}✗${RESET} Failed to start! Check: journalctl -u ${SERVICE_NAME} -n 20"
        exit 1
    fi

    get_server_ip

    # ── Summary ──
    echo ""
    echo -e "  ${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}"
    echo -e "  ${GREEN}${BOLD}✓ Installation Complete${RESET}"
    echo -e "  ${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}"
    echo ""
    echo -e "  ${WHITE}Server${RESET}     http://${SERVER_IP}:${PORT}"
    echo -e "  ${WHITE}Port${RESET}       ${PORT}"
    echo -e "  ${WHITE}Username${RESET}   ${USERNAME}"
    echo -e "  ${WHITE}Password${RESET}   ${PASSWORD}"
    if [[ -n "$EXTRA_ARGS" ]]; then
        echo -e "  ${WHITE}Args${RESET}       ${EXTRA_ARGS}"
    fi
    echo -e "  ${WHITE}Command${RESET}    ${EXEC_CMD}"
    echo ""
    echo -e "  ${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}"
    echo -e "  ${WHITE}${BOLD}Service Commands:${RESET}"
    echo -e "  ${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}"
    echo -e "  ${YELLOW}systemctl start   ${SERVICE_NAME}${RESET}"
    echo -e "  ${YELLOW}systemctl stop    ${SERVICE_NAME}${RESET}"
    echo -e "  ${YELLOW}systemctl restart ${SERVICE_NAME}${RESET}"
    echo -e "  ${YELLOW}systemctl status  ${SERVICE_NAME}${RESET}"
    echo -e "  ${GRAY}journalctl -u ${SERVICE_NAME} -f${RESET}"
    echo ""
}

# ── Uninstall ─────────────────────────────────────────────
do_uninstall() {
    echo -e "  ${CYAN}${BOLD}▸ Uninstalling O11 PRO OTT Streamer${RESET}"
    echo ""

    if [[ ! -f "$SERVICE_FILE" ]]; then
        echo -e "  ${YELLOW}⚠${RESET} Service not found — nothing to uninstall."
        echo ""
        return
    fi

    if systemctl is-active --quiet "${SERVICE_NAME}" 2>/dev/null; then
        systemctl stop "${SERVICE_NAME}"
        echo -e "  ${GREEN}✓${RESET} Service stopped"
    fi

    systemctl disable "${SERVICE_NAME}" >/dev/null 2>&1 || true
    echo -e "  ${GREEN}✓${RESET} Service disabled"

    rm -f "$SERVICE_FILE"
    echo -e "  ${GREEN}✓${RESET} Service file removed"

    systemctl daemon-reload
    echo -e "  ${GREEN}✓${RESET} Daemon reloaded"

    echo ""
    echo -e "  ${GREEN}${BOLD}✓ Uninstall complete${RESET} ${GRAY}(files preserved)${RESET}"
    echo ""
}

# ═══════════════════════════════════════════════════════════
#  Main
# ═══════════════════════════════════════════════════════════

show_banner
detect_os
check_root

echo -e "  ${GREEN}${BOLD}1)${RESET} ${GREEN}Install${RESET}"
echo -e "  ${RED}${BOLD}2)${RESET} ${RED}Uninstall${RESET}"
echo ""
read -p "  Choice [1/2]: " choice
echo ""

case "$choice" in
    1) do_install ;;
    2) do_uninstall ;;
    *) echo -e "  ${RED}✗ Invalid option${RESET}"; exit 1 ;;
esac
