#!/bin/bash

# Function to run a command and print verbose output
run_command() {
    echo "Running: $2"
    eval $1
    if [ $? -eq 0 ]; then
        echo "$2: SUCCESS"
    else
        echo "$2: FAILED"
    fi
}

# Function to detect the OS type
detect_os() {
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        OS=$ID
    elif [ -f /etc/debian_version ]; then
        OS="debian"
    elif [ -f /etc/redhat-release ]; then
        OS="rhel"
    else
        OS=$(uname -s)
    fi
    echo "$OS"
}

# Adding Caddy and Tailscale repositories for Debian/Ubuntu-based systems
add_repos_debian() {
    echo "Adding repositories for Caddy and Tailscale"
    run_command "sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl" "Installing dependencies"
    
    # Add Caddy repository
    run_command "curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy.asc > /dev/null" "Adding Caddy GPG key"
    run_command "curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy.list" "Adding Caddy repository"

    # Add Tailscale repository
    run_command "curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg > /dev/null" "Adding Tailscale GPG key"
    run_command "curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.list | sudo tee /etc/apt/sources.list.d/tailscale.list" "Adding Tailscale repository"
}

# Adding Caddy and Tailscale repositories for Fedora/CentOS-based systems
add_repos_fedora() {
    echo "Adding repositories for Caddy and Tailscale"
    
    # Add Caddy repository
    run_command "dnf install -y 'dnf-command(copr)'" "Installing copr for Fedora"
    run_command "sudo dnf copr enable @caddy/caddy -y" "Adding Caddy repository"

    # Add Tailscale repository
    run_command "sudo dnf config-manager --add-repo https://pkgs.tailscale.com/stable/fedora/tailscale.repo" "Adding Tailscale repository"
}

# Tailscale setup with optional exit node
setup_tailscale() {
    read -p "Do you want to set this server as an exit node for Tailscale? (yes/no): " use_exit_node
    if [ "$use_exit_node" == "yes" ]; then
        read -p "Please provide the exit node IP: " exit_node
        run_command "sudo tailscale up --exit-node=$exit_node" "Tailscale up with exit node"
    else
        run_command "sudo tailscale up" "Tailscale up"
    fi
}

# Detect OS and assign commands
OS=$(detect_os)
echo "Detected OS: $OS"

case "$OS" in
    ubuntu|debian)
        add_repos_debian
        UPDATE_CMD="sudo apt update -y"
        INSTALL_CMD="sudo apt install -y nano curl tailscale caddy"
        ;;
    fedora|rhel|centos)
        add_repos_fedora
        UPDATE_CMD="sudo dnf update -y"
        INSTALL_CMD="sudo dnf install -y nano curl tailscale caddy"
        ;;
    arch)
        UPDATE_CMD="sudo pacman -Syu --noconfirm"
        INSTALL_CMD="sudo pacman -S --noconfirm nano curl tailscale caddy"
        ;;
    *)
        echo "Unsupported OS: $OS"
        exit 1
        ;;
esac

# Update the system and install programs
run_command "$UPDATE_CMD" "Updating system"
run_command "$INSTALL_CMD" "Installing nano, curl, tailscale, and caddy"

# Tailscale configuration
setup_tailscale

echo -e "\nFirst-run setup complete."
