#!/bin/bash
set -euo pipefail

# =============================
# COLORS & LOGGING
# =============================
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

log()  { echo -e "${BLUE}[INFO]${NC} $*"; }
ok()   { echo -e "${GREEN}[OK]${NC} $*"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
err()  { echo -e "${RED}[ERROR]${NC} $*" >&2; }

# =============================
# FLAGS & CONFIG
# =============================
SKIP_PACKAGES=false
SKIP_GIT_CONFIG=false
SKIP_SHELL_CHANGE=false
INSTALL_HOMEBREW=false

GIST_RAW_BASE="https://gist.githubusercontent.com/weehong/c430fefc6e90428dfe6811e0766decf4/raw"
CONFIG_FILES=(
    ".alias"
    ".func"
    ".pathrc"
    ".sourcerc"
    ".vimrc"
    ".zshrc"
)

# =============================
# OS DETECTION
# =============================
detect_os() {
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        echo "$ID"
    else
        echo "unknown"
    fi
}

# =============================
# REQUIREMENTS
# =============================
check_requirements() {
    if [[ $EUID -eq 0 ]]; then
        err "Do not run as root"
        exit 1
    fi
    if ! command -v sudo >/dev/null 2>&1; then
        err "sudo required"
        exit 1
    fi
}

# =============================
# INSTALLATION FUNCTIONS
# =============================
update_system() {
    $SKIP_PACKAGES && return
    log "Updating system..."
    sudo apt-get update -y
    sudo apt-get upgrade -y
    ok "System updated"
}

install_packages() {
    $SKIP_PACKAGES && return
    log "Installing core packages..."
    sudo apt-get install -y \
        zsh git vim curl wget unzip zip build-essential xz-utils
    ok "Packages installed"
}

set_timezone() {
    log "Setting timezone to Asia/Singapore..."
    sudo timedatectl set-timezone Asia/Singapore
    ok "Timezone set to Asia/Singapore"
}

configure_git() {
    $SKIP_GIT_CONFIG && return
    log "Configuring Git..."
    read -p "Git name (leave empty to skip): " name
    read -p "Git email (leave empty to skip): " email
    [[ -n "$name" ]] && git config --global user.name "$name"
    [[ -n "$email" ]] && git config --global user.email "$email"
    ok "Git configured"
}

install_homebrew() {
    ! $INSTALL_HOMEBREW && return
    command -v brew >/dev/null 2>&1 && ok "Homebrew already installed" && return
    log "Installing Homebrew..."
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    ok "Homebrew installed"
}

configure_shell() {
    $SKIP_SHELL_CHANGE && return
    log "Changing default shell to zsh..."
    local zsh_path
    zsh_path="$(command -v zsh)"
    grep -qx "$zsh_path" /etc/shells || echo "$zsh_path" | sudo tee -a /etc/shells >/dev/null
    chsh -s "$zsh_path"
    ok "Shell changed (requires logout/login to take effect)"
}

install_oh_my_zsh() {
    [[ -d "$HOME/.oh-my-zsh" ]] && ok "Oh My Zsh already installed" && return
    log "Installing Oh My Zsh..."
    RUNZSH=no CHSH=no KEEP_ZSHRC=yes \
        sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
    ok "Oh My Zsh installed"
}

install_plugins() {
    log "Installing plugins..."
    local dir="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins"
    mkdir -p "$dir"
    [[ -d "$dir/zsh-autosuggestions" ]] || git clone https://github.com/zsh-users/zsh-autosuggestions "$dir/zsh-autosuggestions"
    [[ -d "$dir/zsh-syntax-highlighting" ]] || git clone https://github.com/zsh-users/zsh-syntax-highlighting "$dir/zsh-syntax-highlighting"
    ok "Plugins installed"
}

install_theme() {
    log "Installing Spaceship theme..."
    local themes="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes"
    local dir="$themes/spaceship-prompt"
    mkdir -p "$themes"
    [[ -d "$dir" ]] || git clone https://github.com/spaceship-prompt/spaceship-prompt.git "$dir" --depth=1
    ln -sf "$dir/spaceship.zsh-theme" "$themes/spaceship.zsh-theme"
    ok "Theme installed"
}

download_configs() {
    log "Downloading custom config files..."
    local backup="$HOME/.config_backup_$(date +%Y%m%d_%H%M%S)"
    mkdir -p "$backup"

    for f in "${CONFIG_FILES[@]}"; do
        local url="$GIST_RAW_BASE/$f"
        local target="$HOME/$f"
        local tmp="${target}.tmp.$$"

        if [[ -f "$target" ]]; then
            cp "$target" "$backup/"
        fi

        log "Fetching $f ..."
        if curl -fsSL "$url" -o "$tmp"; then
            mv "$tmp" "$target"
        else
            rm -f "$tmp"
            warn "Failed to download $f"
        fi
    done

    ok "Configs downloaded (Backup at $backup)"
}

update_zshrc() {
    local zshrc="$HOME/.zshrc"
    log "Checking .zshrc..."

    if [[ ! -f "$zshrc" ]]; then
        warn ".zshrc not found. Run option 10 first."
        return 1
    fi

    ok ".zshrc already comes from the managed gist."
    ok "Load order is built in: .sourcerc -> .func -> .pathrc -> .alias"
}

switch_shell() {
    log "Starting Zsh session..."
    echo -e "${YELLOW}Type 'exit' to return to this installer menu.${NC}"
    echo "----------------------------------------"
    zsh -l
    echo "----------------------------------------"
    ok "Returned from Zsh session"
}

# =============================
# INTERACTIVE MENU
# =============================
show_menu() {
    echo "==========================================="
    echo "Zsh Installer - Choose what to do"
    echo "==========================================="
    echo " 0) Run ALL steps (1-12)"
    echo " 1) Update system packages"
    echo " 2) Install core packages (zsh, git, vim, etc.)"
    echo " 3) Set Timezone (Asia/Singapore)"
    echo " 4) Configure Git"
    echo " 5) Install Homebrew"
    echo " 6) Configure shell (chsh - sets default shell)"
    echo " 7) Install Oh My Zsh"
    echo " 8) Install plugins (autosuggestions, syntax highlighting)"
    echo " 9) Install Spaceship theme"
    echo "10) Download custom configs (~/.alias, .vimrc, etc.)"
    echo "11) Check ~/.zshrc load order"
    echo "12) Switch to Zsh (Temporary Sub-shell)"
    echo "13) Quit"
    echo "==========================================="
}

run_choices() {
    local input
    read -p "Select: " input
    input="${input//,/ }"

    local -a to_run=()
    local -a to_exclude=()

    for item in $input; do
        if [[ "$item" == !* ]]; then
            to_exclude+=("${item:1}")
        elif [[ "$item" == "0" ]]; then
            to_run+=(1 2 3 4 5 6 7 8 9 10 11 12)
        else
            to_run+=("$item")
        fi
    done

    for choice in "${to_run[@]}"; do
        local skip=false

        for ex in "${to_exclude[@]}"; do
            if [[ "$choice" == "$ex" ]]; then
                skip=true
                break
            fi
        done

        $skip && continue

        case "$choice" in
            1) update_system ;;
            2) install_packages ;;
            3) set_timezone ;;
            4) configure_git ;;
            5) install_homebrew ;;
            6) configure_shell ;;
            7) install_oh_my_zsh ;;
            8) install_plugins ;;
            9) install_theme ;;
            10) download_configs ;;
            11) update_zshrc ;;
            12) switch_shell ;;
            13) log "Exiting..."; exit 0 ;;
            *) warn "Skipping invalid option: $choice" ;;
        esac
        echo
    done
}

# =============================
# MAIN
# =============================
main() {
    check_requirements
    while true; do
        show_menu
        run_choices
        read -p "Do you want to run more options? (y/n): " again
        [[ "$again" =~ ^[Yy]$ ]] || break
    done
    ok "Zsh installation/configuration complete!"
}

main "$@"