#!/bin/bash
# ═══════════════════════════════════════════════════════════
#  O11 License Server — Management Script
#  Usage: ./start.sh {start|stop|restart|status|log}
# ═══════════════════════════════════════════════════════════

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"

BIN="$SCRIPT_DIR/license_server"
PID_FILE="$SCRIPT_DIR/license_server.pid"
LOG_FILE="$SCRIPT_DIR/license_server.log"
CFG_FILE="$SCRIPT_DIR/license_server.cfg"

# ANSI 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'
RESET='\033[0m'

# Read port from config
PORT=8088
if [[ -f "$CFG_FILE" ]]; then
    _p=$(grep -E '^PORT=' "$CFG_FILE" | head -1 | cut -d'"' -f2)
    [[ -n "$_p" ]] && PORT="$_p"
fi

# Detect public IP with timeout (3s)
get_public_ip() {
    local ip
    ip=$(timeout 3 curl -s4 ifconfig.me 2>/dev/null || timeout 3 curl -s4 icanhazip.com 2>/dev/null || timeout 3 curl -s4 ipinfo.io/ip 2>/dev/null)
    if [[ -n "$ip" ]] && [[ "$ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
        echo "$ip"
    else
        echo "N/A"
    fi
}

is_running() {
    if [[ -f "$PID_FILE" ]]; then
        local pid
        pid=$(cat "$PID_FILE")
        if kill -0 "$pid" 2>/dev/null; then
            echo "$pid"
            return 0
        fi
        rm -f "$PID_FILE"
    fi
    return 1
}

start() {
    local pid
    if pid=$(is_running); then
        echo -e "${YELLOW}[O11]${RESET} Server already running (PID: ${CYAN}$pid${RESET}, port: ${CYAN}$PORT${RESET})"
        return 1
    fi

    if [[ ! -x "$BIN" ]]; then
        echo -e "${RED}[O11] ERROR:${RESET} Binary not found or not executable: $BIN"
        return 1
    fi

    # Read configuration
    local license_ids="N/A"
    local binary_vers="N/A"
    local strict_mode="N/A"
    local allowed_ips="all"
    
    if [[ -f "$CFG_FILE" ]]; then
        license_ids=$(grep -E '^LICENSE_ID=' "$CFG_FILE" | head -1 | cut -d'"' -f2)
        binary_vers=$(grep -E '^BINARY_VERSION=' "$CFG_FILE" | head -1 | cut -d'"' -f2)
        strict_mode=$(grep -E '^STRICT_MODE=' "$CFG_FILE" | head -1 | cut -d'"' -f2)
    fi
    
    if [[ -f "$SCRIPT_DIR/ips.txt" ]]; then
        local ip_count
        ip_count=$(grep -v '^#' "$SCRIPT_DIR/ips.txt" | grep -v '^[[:space:]]*$' | wc -l)
        if (( ip_count > 0 )); then
            allowed_ips="$ip_count IPs only"
        fi
    fi

    # Detect public IP
    echo -e "${GRAY}Detecting public IP...${RESET}"
    local public_ip
    public_ip=$(get_public_ip)

    echo -e "${BLUE}═══════════════════════════════════════════════════════════${RESET}"
    echo -e "${WHITE}  O11 License Server ${GRAY}—${WHITE} Starting${RESET}"
    echo -e "${BLUE}═══════════════════════════════════════════════════════════${RESET}"
    echo -e "  ${BOLD}Port:${RESET}           ${CYAN}$PORT${RESET}"
    echo -e "  ${BOLD}Public IP:${RESET}      ${GREEN}$public_ip${RESET}"
    echo -e "  ${BOLD}Local API:${RESET}      ${CYAN}https://127.0.0.1:$PORT/${RESET}"
    [[ "$public_ip" != "N/A" ]] && echo -e "  ${BOLD}Public API:${RESET}     ${CYAN}https://$public_ip:$PORT/${RESET}"
    echo -e "  ${BOLD}License ID:${RESET}     ${MAGENTA}$license_ids${RESET}"
    echo -e "  ${BOLD}Binary Ver:${RESET}     ${MAGENTA}$binary_vers${RESET}"
    if [[ "$strict_mode" == "true" ]]; then
        echo -e "  ${BOLD}Strict Mode:${RESET}    ${RED}$strict_mode${RESET}"
    else
        echo -e "  ${BOLD}Strict Mode:${RESET}    ${GREEN}$strict_mode${RESET}"
    fi
    echo -e "  ${BOLD}Allowed IPs:${RESET}    ${YELLOW}$allowed_ips${RESET}"
    echo -e "${BLUE}═══════════════════════════════════════════════════════════${RESET}"

    nohup "$BIN" >> "$LOG_FILE" 2>&1 &
    local new_pid=$!
    echo "$new_pid" > "$PID_FILE"

    sleep 0.8
    if kill -0 "$new_pid" 2>/dev/null; then
        echo ""
        echo -e "${GREEN}[O11] ✓ Server started${RESET} (PID: ${CYAN}$new_pid${RESET})"
        echo ""
        echo -e "${BLUE}╔════════════════════════════════════════════════════════╗${RESET}"
        echo -e "${BLUE}║${RESET}  ${WHITE}Live log (10 seconds)${RESET} ${GRAY}— Ctrl+C to stop${RESET}          ${BLUE}║${RESET}"
        echo -e "${BLUE}╚════════════════════════════════════════════════════════╝${RESET}"
        # Show live log for 10 seconds
        timeout 10 tail -f "$LOG_FILE" 2>/dev/null || tail -n 5 "$LOG_FILE" 2>/dev/null
        echo ""
        echo -e "${GRAY}Server is running in background. Use ${CYAN}'./start.sh log'${GRAY} for continuous log.${RESET}"
    else
        echo ""
        echo -e "${RED}[O11] ✗ ERROR: Server stopped immediately!${RESET}"
        echo ""
        echo -e "${RED}═══════════════════════════════════════════════════════════${RESET}"
        echo -e "  ${WHITE}Last 10 log lines:${RESET}"
        echo -e "${RED}═══════════════════════════════════════════════════════════${RESET}"
        rm -f "$PID_FILE"
        tail -10 "$LOG_FILE" 2>/dev/null
        return 1
    fi
}

stop() {
    local pid
    if pid=$(is_running); then
        kill "$pid" 2>/dev/null
        for i in {1..6}; do
            if ! kill -0 "$pid" 2>/dev/null; then
                break
            fi
            sleep 0.5
        done
        if kill -0 "$pid" 2>/dev/null; then
            kill -9 "$pid" 2>/dev/null
            sleep 0.3
        fi
        rm -f "$PID_FILE"
        echo -e "${GREEN}[O11]${RESET} Server stopped (PID: ${CYAN}$pid${RESET})"
    else
        echo -e "${YELLOW}[O11]${RESET} Server is not running"
    fi
}

restart() {
    echo -e "${BLUE}═══════════════════════════════════════════════════════════${RESET}"
    echo -e "${WHITE}  O11 License Server ${GRAY}—${WHITE} Restarting${RESET}"
    echo -e "${BLUE}═══════════════════════════════════════════════════════════${RESET}"
    stop
    sleep 1
    start
}

status() {
    local pid
    if pid=$(is_running); then
        # Read configuration
        local license_ids="N/A"
        local binary_vers="N/A"
        local strict_mode="N/A"
        local allowed_ips="all"
        
        if [[ -f "$CFG_FILE" ]]; then
            license_ids=$(grep -E '^LICENSE_ID=' "$CFG_FILE" | head -1 | cut -d'"' -f2)
            binary_vers=$(grep -E '^BINARY_VERSION=' "$CFG_FILE" | head -1 | cut -d'"' -f2)
            strict_mode=$(grep -E '^STRICT_MODE=' "$CFG_FILE" | head -1 | cut -d'"' -f2)
        fi
        
        if [[ -f "$SCRIPT_DIR/ips.txt" ]]; then
            local ip_count
            ip_count=$(grep -v '^#' "$SCRIPT_DIR/ips.txt" | grep -v '^[[:space:]]*$' | wc -l)
            if (( ip_count > 0 )); then
                allowed_ips="$ip_count IPs ($(grep -v '^#' "$SCRIPT_DIR/ips.txt" | grep -v '^[[:space:]]*$' | tr '\n' ' ' | sed 's/ $//'))"
            fi
        fi

        local uptime_info=""
        if [[ -d "/proc/$pid" ]]; then
            local start_time
            start_time=$(stat -c %Y "/proc/$pid" 2>/dev/null)
            if [[ -n "$start_time" ]]; then
                local now
                now=$(date +%s)
                local elapsed=$(( now - start_time ))
                local days=$(( elapsed / 86400 ))
                local hours=$(( (elapsed % 86400) / 3600 ))
                local mins=$(( (elapsed % 3600) / 60 ))
                local secs=$(( elapsed % 60 ))
                if (( days > 0 )); then
                    uptime_info="${days}d ${hours}h ${mins}m"
                elif (( hours > 0 )); then
                    uptime_info="${hours}h ${mins}m ${secs}s"
                else
                    uptime_info="${mins}m ${secs}s"
                fi
            fi
        fi

        local socket_status="${RED}CLOSED${RESET}"
        local socket_color="$RED"
        if ss -tlnp 2>/dev/null | grep -q ":${PORT} "; then
            socket_status="${GREEN}LISTENING${RESET}"
            socket_color="$GREEN"
        fi

        # Detect public IP
        local public_ip
        public_ip=$(get_public_ip)

        # Statistics from log
        local total_requests=0
        local granted_count=0
        local denied_count=0
        if [[ -f "$LOG_FILE" ]]; then
            total_requests=$(grep -c 'REQUEST' "$LOG_FILE" 2>/dev/null || echo 0)
            granted_count=$(grep -c 'GRANTED' "$LOG_FILE" 2>/dev/null || echo 0)
            denied_count=$(grep -c 'DENIED' "$LOG_FILE" 2>/dev/null || echo 0)
        fi

        echo -e "${BLUE}═══════════════════════════════════════════════════════════${RESET}"
        echo -e "${WHITE}  O11 License Server ${GRAY}—${WHITE} Status${RESET}"
        echo -e "${BLUE}═══════════════════════════════════════════════════════════${RESET}"
        echo -e "  ${BOLD}Status:${RESET}         ${GREEN}✓ ACTIVE${RESET}"
        echo -e "  ${BOLD}PID:${RESET}            ${CYAN}$pid${RESET}"
        echo -e "  ${BOLD}Port:${RESET}           ${CYAN}$PORT${RESET}"
        echo -e "  ${BOLD}Socket:${RESET}         $socket_status ${GRAY}on :$PORT${RESET}"
        [[ -n "$uptime_info" ]] && echo -e "  ${BOLD}Uptime:${RESET}         ${CYAN}$uptime_info${RESET}"
        echo -e "  ${BOLD}Public IP:${RESET}      ${GREEN}$public_ip${RESET}"
        echo -e "${GRAY}───────────────────────────────────────────────────────────${RESET}"
        echo -e "  ${BOLD}Local API:${RESET}      ${CYAN}https://127.0.0.1:$PORT/${RESET}"
        [[ "$public_ip" != "N/A" ]] && echo -e "  ${BOLD}Public API:${RESET}     ${CYAN}https://$public_ip:$PORT/${RESET}"
        echo -e "  ${BOLD}License ID:${RESET}     ${MAGENTA}$license_ids${RESET}"
        echo -e "  ${BOLD}Binary Ver:${RESET}     ${MAGENTA}$binary_vers${RESET}"
        if [[ "$strict_mode" == "true" ]]; then
            echo -e "  ${BOLD}Strict Mode:${RESET}    ${RED}$strict_mode${RESET}"
        else
            echo -e "  ${BOLD}Strict Mode:${RESET}    ${GREEN}$strict_mode${RESET}"
        fi
        echo -e "  ${BOLD}Allowed IPs:${RESET}    ${YELLOW}$allowed_ips${RESET}"
        echo -e "${GRAY}───────────────────────────────────────────────────────────${RESET}"
        echo -e "  ${BOLD}Requests:${RESET}       ${WHITE}$total_requests${RESET} ${GRAY}total${RESET}"
        echo -e "  ${BOLD}Granted:${RESET}        ${GREEN}$granted_count${RESET}"
        if (( denied_count > 0 )); then
            echo -e "  ${BOLD}Denied:${RESET}         ${RED}$denied_count${RESET}"
        else
            echo -e "  ${BOLD}Denied:${RESET}         ${GRAY}$denied_count${RESET}"
        fi
        echo -e "${BLUE}═══════════════════════════════════════════════════════════${RESET}"
        
        if [[ -f "$LOG_FILE" ]]; then
            echo ""
            echo -e "${BLUE}╔════════════════════════════════════════════════════════╗${RESET}"
            echo -e "${BLUE}║${RESET}  ${WHITE}Live log (15 seconds)${RESET} ${GRAY}— Ctrl+C to stop${RESET}          ${BLUE}║${RESET}"
            echo -e "${BLUE}╚════════════════════════════════════════════════════════╝${RESET}"
            # Show last 5 lines + live tail for 15 seconds
            tail -5 "$LOG_FILE" 2>/dev/null
            timeout 15 tail -f "$LOG_FILE" 2>/dev/null
            echo ""
            echo -e "${GRAY}For continuous log use: ${CYAN}'./start.sh log'${RESET}"
        fi
    else
        echo -e "${BLUE}═══════════════════════════════════════════════════════════${RESET}"
        echo -e "${WHITE}  O11 License Server ${GRAY}—${WHITE} Status${RESET}"
        echo -e "${BLUE}═══════════════════════════════════════════════════════════${RESET}"
        echo -e "  ${BOLD}Status:${RESET}         ${RED}✗ STOPPED${RESET}"
        echo -e "${BLUE}═══════════════════════════════════════════════════════════${RESET}"
    fi
}

show_log() {
    if [[ -f "$LOG_FILE" ]]; then
        echo -e "${CYAN}[O11]${RESET} Live log ${GRAY}(Ctrl+C to exit)${RESET}"
        echo -e "${GRAY}────────────────────────────────────────────────────────────${RESET}"
        tail -f "$LOG_FILE"
    else
        echo -e "${RED}[O11]${RESET} Log file not found: ${GRAY}$LOG_FILE${RESET}"
    fi
}

case "${1,,}" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    status)
        status
        ;;
    log)
        show_log
        ;;
    *)
        echo -e "${WHITE}${BOLD}O11 License Server${RESET} ${GRAY}—${RESET} ${CYAN}Management${RESET}"
        echo ""
        echo -e "${BOLD}Usage:${RESET} ${CYAN}$0${RESET} ${YELLOW}{start|stop|restart|status|log}${RESET}"
        echo ""
        echo -e "  ${GREEN}start${RESET}   — Start the license server"
        echo -e "  ${RED}stop${RESET}    — Stop the license server"
        echo -e "  ${YELLOW}restart${RESET} — Restart the license server"
        echo -e "  ${CYAN}status${RESET}  — Show server status and live log"
        echo -e "  ${MAGENTA}log${RESET}     — Show continuous live log (tail -f)"
        exit 1
        ;;
esac
