#!/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; }

# =============================
# CONFIG
# =============================
GIST_RAW_BASE="https://opengist.rmrf.online/weehong/f0d940c3c1214bf5b7996195199fdc09/raw/HEAD"

CONFIG_FILES=(
    ".alias"
    ".func"
    ".pathrc"
    ".sourcerc"
    ".vimrc"
    ".zshrc"
    ".config/starship.toml"
)

# =============================
# REQUIREMENTS
# =============================
check_requirements() {
    if [[ $EUID -eq 0 ]]; then
        err "Do not run as root on macOS"
        exit 1
    fi
}

# =============================
# INSTALLATION FUNCTIONS
# =============================
install_oh_my_zsh() {
    log "Installing Oh My Zsh and plugins..."
    export RUNZSH=no
    export CHSH=no
    export KEEP_ZSHRC=yes

    if [[ ! -d "$HOME/.oh-my-zsh" ]]; then
        sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" --unattended
    else
        ok "Oh My Zsh already installed"
    fi

    local custom="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}"
    local plugin_dir="$custom/plugins"
    mkdir -p "$plugin_dir"

    [[ -d "$plugin_dir/zsh-autosuggestions" ]] || \
        git clone https://github.com/zsh-users/zsh-autosuggestions "$plugin_dir/zsh-autosuggestions"

    [[ -d "$plugin_dir/zsh-syntax-highlighting" ]] || \
        git clone https://github.com/zsh-users/zsh-syntax-highlighting "$plugin_dir/zsh-syntax-highlighting"

    ok "Oh My Zsh plugins installed to $plugin_dir"
}

install_starship() {
    if command -v starship >/dev/null 2>&1 || [[ -f "$HOME/.local/bin/starship" ]]; then
        ok "Starship already installed"
    elif command -v brew >/dev/null 2>&1; then
        log "Installing Starship with Homebrew..."
        brew install starship
        ok "Starship installed"
    else
        log "Installing Starship..."
        mkdir -p "$HOME/.local/bin"
        curl -fsSL https://starship.rs/install.sh | sh -s -- -y -b "$HOME/.local/bin"
        ok "Starship installed"
    fi
}

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
        # Strip the leading dot for the download URL
        local remote_file="${f#.}"
        [[ "$f" == ".config/starship.toml" ]] && remote_file="starship.toml"
        local url="$GIST_RAW_BASE/$remote_file"
        local target="$HOME/$f"
        local tmp="${target}.tmp.$$"

        mkdir -p "$(dirname "$target")"

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

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

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

configure_zshrc() {
    local zshrc="$HOME/.zshrc"
    log "Configuring .zshrc for Oh My Zsh and Starship..."

    touch "$zshrc"
    cp "$zshrc" "$HOME/.zshrc.backup_$(date +%Y%m%d_%H%M%S)"

    cat > "$zshrc" <<'EOF'
# =============================================================================
# 1. HELPER FUNCTIONS & PATH
# =============================================================================
source_if_readable() {
    local file="$1"
    if [[ -f "$file" && -r "$file" ]]; then
        source "$file"
    fi
}

export PATH="$HOME/.local/bin:$PATH"

# =============================================================================
# 2. OH MY ZSH FRAMEWORK
# =============================================================================
export ZSH="${ZSH:-$HOME/.oh-my-zsh}"
ZSH_THEME=""

plugins=(
    git
    zsh-autosuggestions
    zsh-syntax-highlighting
)

source_if_readable "$ZSH/oh-my-zsh.sh"

# =============================================================================
# 3. THIRD-PARTY INITIALIZATION & CUSTOM CONFIGS
# =============================================================================
source_if_readable "$HOME/.sourcerc"
source_if_readable "$HOME/.func"
source_if_readable "$HOME/.pathrc"
source_if_readable "$HOME/.alias"

# =============================================================================
# 4. STARSHIP PROMPT
# =============================================================================
if [[ -z "${STARSHIP_CONFIG:-}" && -f "$HOME/.config/starship.toml" ]]; then
    export STARSHIP_CONFIG="$HOME/.config/starship.toml"
fi

if command -v starship >/dev/null 2>&1; then
    eval "$(starship init zsh)"
elif [[ -x "$HOME/.local/bin/starship" ]]; then
    eval "$("$HOME/.local/bin/starship" init zsh)"
fi
EOF

    ok ".zshrc configured for Oh My Zsh framework with Starship prompt"
}

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 "macOS Minimal Zsh Setup - Choose what to do"
    echo "==========================================="
    echo " 0) Run ALL steps (1-5)"
    echo " 1) Install Oh My Zsh + plugins"
    echo " 2) Install Starship prompt"
    echo " 3) Download custom configs (~/.alias, .func, .vimrc, etc.)"
    echo " 4) Configure ~/.zshrc (Oh My Zsh + Starship)"
    echo " 5) Switch to Zsh (Temporary Sub-shell)"
    echo " 6) 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)
        else
            to_run+=("$item")
        fi
    done

    if [[ ${#to_run[@]} -gt 0 ]]; then
        for choice in "${to_run[@]}"; do
            local skip=false

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

            $skip && continue

            case "$choice" in
                1) install_oh_my_zsh ;;
                2) install_starship ;;
                3) download_configs ;;
                4) configure_zshrc ;;
                5) switch_shell ;;
                6) exit 0 ;;
                *) warn "Skipping invalid option: $choice" ;;
            esac
            echo
        done
    fi
}

# =============================
# 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 "macOS minimal Zsh configuration complete!"
}

main "$@"
