#!/usr/bin/env bash

COMMANDS_FILE="$HOME/.fedya_commands"
EDITOR_CMD="${EDITOR:-nano}"

# Модерна цветна палитра
C_RESET=$'\033[0m'
C_BOLD=$'\033[1m'
C_DIM=$'\033[2m'

# Основни цветове
C_PRIMARY=$'\033[38;5;81m'      # Светло синьо
C_SUCCESS=$'\033[38;5;82m'      # Зелено
C_WARNING=$'\033[38;5;214m'     # Оранжево
C_ERROR=$'\033[38;5;196m'       # Червено
C_INFO=$'\033[38;5;147m'        # Лавандула

# Акцентни цветове
C_TITLE=$'\033[38;5;213m'       # Розово-лилаво
C_KEY=$'\033[38;5;226m'         # Жълто
C_VAL=$'\033[38;5;153m'         # Светло синьо
C_DESC=$'\033[38;5;249m'        # Светло сиво
C_BORDER=$'\033[38;5;240m'      # Сиво

# Box drawing символи
BOX_TL="╭"
BOX_TR="╮"
BOX_BL="╰"
BOX_BR="╯"
BOX_H="─"
BOX_V="│"
BOX_VR="├"
BOX_VL="┤"

ensure_file() {
    [ -f "$COMMANDS_FILE" ] || touch "$COMMANDS_FILE"
}

print_header() {
    local width=70
    clear
    echo
    printf "%b" "${C_PRIMARY}${C_BOLD}"
    printf "%s%${width}s%s\n" "$BOX_TL" "" "$BOX_TR" | tr ' ' "$BOX_H"
    printf "%s%-${width}s%s\n" "$BOX_V" "  ⚡ CMDCTL - Мениджър за Полезни Команди" "$BOX_V"
    printf "%s%${width}s%s\n" "$BOX_BL" "" "$BOX_BR" | tr ' ' "$BOX_H"
    printf "%b\n" "${C_RESET}"
}

list_commands() {
    ensure_file
    print_header

    local count=$(grep -c '^#CMD:' "$COMMANDS_FILE" 2>/dev/null || echo 0)

    printf "%b%s %s%b\n" "${C_INFO}${C_BOLD}" "📦 Общо команди:" "$count" "${C_RESET}"
    printf "%b%s%b\n\n" "${C_DIM}" "Файл: $COMMANDS_FILE" "${C_RESET}"

    if [ "$count" -eq 0 ]; then
        printf "%b%s%b\n\n" "${C_WARNING}" "  ⚠️  Няма запазени команди" "${C_RESET}"
    else
        local i=1
        while IFS= read -r line; do
            if [[ "$line" =~ ^#CMD: ]]; then
                local name="${line#\#CMD: }"
                read -r desc
                desc="${desc#\#DESC: }"
                read -r cmd

                printf "%b[%d]%b %b%s%b\n" "${C_KEY}${C_BOLD}" "$i" "${C_RESET}" "${C_PRIMARY}${C_BOLD}" "$name" "${C_RESET}"
                printf "    %b%s%b\n" "${C_DESC}${C_DIM}" "$desc" "${C_RESET}"
                printf "    %b➜%b %b%s%b\n\n" "${C_SUCCESS}" "${C_RESET}" "${C_VAL}" "$cmd" "${C_RESET}"

                ((i++))
            fi
        done < "$COMMANDS_FILE"
    fi
}

add_command() {
    ensure_file
    print_header

    printf "%b%s%b\n\n" "${C_SUCCESS}${C_BOLD}" "➕ Добавяне на нова команда" "${C_RESET}"

    printf "%b%s%b\n" "${C_DIM}" "Съвет: Използвай кратко и ясно име (напр: mikrotik-backup, ssh-keygen)" "${C_RESET}"
    printf "%b%s%b" "${C_INFO}" "Име на командата: " "${C_RESET}"
    read -r name

    if [ -z "$name" ]; then
        printf "\n%b%s%b\n" "${C_ERROR}" "❌ Името не може да бъде празно!" "${C_RESET}"
        sleep 2
        return
    fi

    # Проверка дали съществува
    if grep -q "^#CMD: $name$" "$COMMANDS_FILE" 2>/dev/null; then
        printf "\n%b%s%b\n" "${C_ERROR}" "❌ Команда '$name' вече съществува!" "${C_RESET}"
        sleep 2
        return
    fi

    printf "\n%b%s%b\n" "${C_DIM}" "Напиши кратко описание какво прави командата" "${C_RESET}"
    printf "%b%s%b" "${C_INFO}" "Описание: " "${C_RESET}"
    read -r desc

    if [ -z "$desc" ]; then
        printf "\n%b%s%b\n" "${C_ERROR}" "❌ Описанието не може да бъде празно!" "${C_RESET}"
        sleep 2
        return
    fi

    printf "\n%b%s%b\n" "${C_DIM}" "Въведи пълната команда (може да е многоредова)" "${C_RESET}"
    printf "%b%s%b" "${C_INFO}" "Команда: " "${C_RESET}"
    read -r cmd

    if [ -z "$cmd" ]; then
        printf "\n%b%s%b\n" "${C_ERROR}" "❌ Командата не може да бъде празна!" "${C_RESET}"
        sleep 2
        return
    fi

    # Запазване
    {
        echo "#CMD: $name"
        echo "#DESC: $desc"
        echo "$cmd"
        echo ""
    } >> "$COMMANDS_FILE"

    printf "\n%b%s%b %b%s%b\n" "${C_SUCCESS}${C_BOLD}" "✅ Успешно добавена:" "${C_RESET}" "${C_KEY}" "$name" "${C_RESET}"
    sleep 2
}

remove_command() {
    ensure_file
    print_header

    printf "%b%s%b\n\n" "${C_WARNING}${C_BOLD}" "🗑️  Премахване на команда" "${C_RESET}"

    local count=$(grep -c '^#CMD:' "$COMMANDS_FILE" 2>/dev/null || echo 0)
    if [ "$count" -eq 0 ]; then
        printf "%b%s%b\n" "${C_WARNING}" "⚠️  Няма команди за премахване" "${C_RESET}"
        sleep 2
        return
    fi

    printf "%b%s%b" "${C_INFO}" "Име на командата за премахване: " "${C_RESET}"
    read -r name

    if [ -z "$name" ]; then
        printf "\n%b%s%b\n" "${C_ERROR}" "❌ Не е въведено име!" "${C_RESET}"
        sleep 2
        return
    fi

    if grep -q "^#CMD: $name$" "$COMMANDS_FILE" 2>/dev/null; then
        # Изтриване на командата и следващите 3 реда (описание, команда, празен ред)
        sed -i "/^#CMD: $name$/,+3d" "$COMMANDS_FILE"
        printf "\n%b%s%b %b%s%b\n" "${C_SUCCESS}${C_BOLD}" "✅ Премахната:" "${C_RESET}" "${C_KEY}" "$name" "${C_RESET}"
    else
        printf "\n%b%s%b\n" "${C_ERROR}" "❌ Команда '$name' не съществува!" "${C_RESET}"
    fi
    sleep 2
}

view_command() {
    ensure_file
    print_header

    printf "%b%s%b\n\n" "${C_INFO}${C_BOLD}" "🔍 Преглед на конкретна команда" "${C_RESET}"

    local count=$(grep -c '^#CMD:' "$COMMANDS_FILE" 2>/dev/null || echo 0)
    if [ "$count" -eq 0 ]; then
        printf "%b%s%b\n" "${C_WARNING}" "⚠️  Няма запазени команди" "${C_RESET}"
        sleep 2
        return
    fi

    printf "%b%s%b" "${C_INFO}" "Име на командата: " "${C_RESET}"
    read -r name

    if [ -z "$name" ]; then
        printf "\n%b%s%b\n" "${C_ERROR}" "❌ Не е въведено име!" "${C_RESET}"
        sleep 2
        return
    fi

    local found=0
    while IFS= read -r line; do
        if [[ "$line" == "#CMD: $name" ]]; then
            found=1
            echo
            printf "%b%s%b\n" "${C_PRIMARY}${C_BOLD}" "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" "${C_RESET}"
            printf "%b%s%b %b%s%b\n" "${C_KEY}${C_BOLD}" "Име:" "${C_RESET}" "${C_PRIMARY}" "$name" "${C_RESET}"

            read -r desc
            desc="${desc#\#DESC: }"
            printf "%b%s%b %b%s%b\n" "${C_KEY}${C_BOLD}" "Описание:" "${C_RESET}" "${C_DESC}" "$desc" "${C_RESET}"

            read -r cmd
            printf "%b%s%b\n" "${C_KEY}${C_BOLD}" "Команда:" "${C_RESET}"
            printf "  %b%s%b\n" "${C_VAL}" "$cmd" "${C_RESET}"
            printf "%b%s%b\n\n" "${C_PRIMARY}${C_BOLD}" "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" "${C_RESET}"

            printf "%b%s%b" "${C_WARNING}" "Копирай командата в клипборда? (y/n): " "${C_RESET}"
            read -r copy
            if [[ "$copy" == "y" || "$copy" == "Y" ]]; then
                if command -v xclip >/dev/null 2>&1; then
                    echo "$cmd" | xclip -selection clipboard
                    printf "%b%s%b\n" "${C_SUCCESS}" "✅ Копирано в клипборда!" "${C_RESET}"
                elif command -v xsel >/dev/null 2>&1; then
                    echo "$cmd" | xsel --clipboard
                    printf "%b%s%b\n" "${C_SUCCESS}" "✅ Копирано в клипборда!" "${C_RESET}"
                else
                    printf "%b%s%b\n" "${C_WARNING}" "⚠️  xclip/xsel не са инсталирани" "${C_RESET}"
                fi
            fi
            break
        fi
    done < "$COMMANDS_FILE"

    if [ "$found" -eq 0 ]; then
        printf "\n%b%s%b\n" "${C_ERROR}" "❌ Команда '$name' не съществува!" "${C_RESET}"
    fi

    echo
    read -rp "Натисни Enter за продължаване..."
}

edit_commands() {
    ensure_file
    "$EDITOR_CMD" "$COMMANDS_FILE"
}

fzf_menu() {
    if ! command -v fzf >/dev/null; then
        print_header
        printf "%b%s%b\n" "${C_ERROR}" "❌ fzf не е инсталиран!" "${C_RESET}"
        printf "%b%s%b\n" "${C_INFO}" "Инсталирай с: sudo dnf install fzf" "${C_RESET}"
        sleep 3
        return
    fi

    ensure_file

    # Проверка дали има команди
    local count=$(grep -c '^#CMD:' "$COMMANDS_FILE" 2>/dev/null || echo 0)
    if [ "$count" -eq 0 ]; then
        print_header
        printf "%b%s%b\n" "${C_WARNING}" "⚠️  Няма запазени команди за преглед" "${C_RESET}"
        sleep 2
        return
    fi

    # Подготовка: Създаваме два файла - един за display, един за команди
    local display_file=$(mktemp)
    local cmd_file=$(mktemp)
    local line_num=0

    while IFS= read -r line; do
        if [[ "$line" =~ ^#CMD: ]]; then
            local name="${line#\#CMD: }"
            IFS= read -r desc_line
            local desc="${desc_line#\#DESC: }"
            IFS= read -r cmd_line

            # Display file - това виждаме в списъка
            printf "%3d) %-25s - %s\n" "$((++line_num))" "$name" "$desc" >> "$display_file"

            # Command file - съхраняваме командата на същия ред номер
            echo "$cmd_line" >> "$cmd_file"
        fi
    done < "$COMMANDS_FILE"

    # FZF избор
    local selected=$(cat "$display_file" | fzf \
              --height=60% \
              --border=rounded \
              --prompt="🔍 Търси: " \
              --header="↑↓ Навигация | Enter = Избор | ESC = Изход" \
              --color="fg:#d0d0d0,bg:#1e1e1e,hl:#5fd7ff" \
              --color="fg+:#ffffff,bg+:#2e2e2e,hl+:#ffaf00" \
              --color="info:#af87ff,prompt:#5fd7ff,pointer:#ff87d7" \
              --color="marker:#87ff00,spinner:#ff87d7,header:#87afaf")

    if [ -n "$selected" ]; then
        # Извличаме номера на реда
        local num=$(echo "$selected" | awk '{print $1}' | tr -d ')')

        # Взимаме командата от command file
        local cmd=$(sed -n "${num}p" "$cmd_file")

        rm -f "$display_file" "$cmd_file"

        print_header
        printf "%b%s%b\n\n" "${C_SUCCESS}${C_BOLD}" "✅ Избрана команда:" "${C_RESET}"
        printf "%b%s%b\n\n" "${C_VAL}" "$cmd" "${C_RESET}"

        printf "%b%s%b" "${C_WARNING}" "Копирай в клипборда? (y/n): " "${C_RESET}"
        read -r copy
        if [[ "$copy" == "y" || "$copy" == "Y" ]]; then
            if command -v xclip >/dev/null 2>&1; then
                echo "$cmd" | xclip -selection clipboard
                printf "\n%b%s%b\n" "${C_SUCCESS}" "✅ Копирано в клипборда!" "${C_RESET}"
                sleep 1
            elif command -v xsel >/dev/null 2>&1; then
                echo "$cmd" | xsel --clipboard
                printf "\n%b%s%b\n" "${C_SUCCESS}" "✅ Копирано в клипборда!" "${C_RESET}"
                sleep 1
            else
                printf "\n%b%s%b\n" "${C_WARNING}" "⚠️  Инсталирай xclip или xsel за копиране" "${C_RESET}"
                sleep 2
            fi
        fi

        echo
        read -rp "Натисни Enter за продължаване..."
    else
        rm -f "$display_file" "$cmd_file"
    fi
}

search_commands() {
    ensure_file
    print_header

    printf "%b%s%b\n\n" "${C_INFO}${C_BOLD}" "🔎 Търсене в командите" "${C_RESET}"

    printf "%b%s%b" "${C_INFO}" "Търси (име/описание/команда): " "${C_RESET}"
    read -r search_term

    if [ -z "$search_term" ]; then
        printf "\n%b%s%b\n" "${C_ERROR}" "❌ Въведи текст за търсене!" "${C_RESET}"
        sleep 2
        return
    fi

    echo
    printf "%b%s%b\n\n" "${C_SUCCESS}" "Резултати за: $search_term" "${C_RESET}"

    local found=0
    while IFS= read -r line; do
        if [[ "$line" =~ ^#CMD: ]]; then
            local name="${line#\#CMD: }"
            read -r desc
            desc="${desc#\#DESC: }"
            read -r cmd

            if [[ "$name" =~ $search_term ]] || [[ "$desc" =~ $search_term ]] || [[ "$cmd" =~ $search_term ]]; then
                found=1
                printf "%b●%b %b%s%b\n" "${C_SUCCESS}" "${C_RESET}" "${C_PRIMARY}${C_BOLD}" "$name" "${C_RESET}"
                printf "  %b%s%b\n" "${C_DESC}${C_DIM}" "$desc" "${C_RESET}"
                printf "  %b➜%b %b%s%b\n\n" "${C_KEY}" "${C_RESET}" "${C_VAL}" "$cmd" "${C_RESET}"
            fi
        fi
    done < "$COMMANDS_FILE"

    if [ "$found" -eq 0 ]; then
        printf "%b%s%b\n" "${C_WARNING}" "⚠️  Няма намерени резултати" "${C_RESET}"
    fi

    echo
    read -rp "Натисни Enter за продължаване..."
}

show_help() {
    print_header

    printf "%b%s%b\n\n" "${C_INFO}${C_BOLD}" "📖 Помощна информация" "${C_RESET}"

    printf "%b%s%b\n" "${C_PRIMARY}" "Файл с команди:" "${C_RESET}"
    printf "  %b%s%b\n\n" "${C_VAL}" "$COMMANDS_FILE" "${C_RESET}"

    printf "%b%s%b\n" "${C_PRIMARY}" "Редактор:" "${C_RESET}"
    printf "  %b%s%b\n\n" "${C_VAL}" "$EDITOR_CMD" "${C_RESET}"

    printf "%b%s%b\n" "${C_PRIMARY}" "Формат на командите:" "${C_RESET}"
    printf "  %b%s%b\n" "${C_DESC}" "Всяка команда се съхранява с име, описание и самата команда" "${C_RESET}"
    printf "  %b%s%b\n\n" "${C_DESC}" "Можете да търсите, прегледате и копирате команди лесно" "${C_RESET}"

    printf "%b%s%b\n" "${C_PRIMARY}" "Препоръки:" "${C_RESET}"
    printf "  %b%s%b\n" "${C_DESC}" "• Използвай кратки и ясни имена" "${C_RESET}"
    printf "  %b%s%b\n" "${C_DESC}" "• Пиши подробни описания" "${C_RESET}"
    printf "  %b%s%b\n" "${C_DESC}" "• Групирай сходни команди с общ префикс (напр: mikrotik-*, docker-*)" "${C_RESET}"
    printf "  %b%s%b\n\n" "${C_DESC}" "• За копиране в клипборда инсталирай xclip или xsel" "${C_RESET}"

    read -rp "Натисни Enter за продължаване..."
}

main_menu() {
    print_header

    printf "%b%s%b\n" "${C_BORDER}${C_DIM}" "Избери опция:" "${C_RESET}"
    echo

    printf "  %b[1]%b  📋 Преглед на всички команди\n" "${C_KEY}${C_BOLD}" "${C_RESET}"
    printf "  %b[2]%b  ➕ Добавяне на нова команда\n" "${C_KEY}${C_BOLD}" "${C_RESET}"
    printf "  %b[3]%b  🔍 Преглед на конкретна команда\n" "${C_KEY}${C_BOLD}" "${C_RESET}"
    printf "  %b[4]%b  🔎 Търсене в командите\n" "${C_KEY}${C_BOLD}" "${C_RESET}"
    printf "  %b[5]%b  🗑️  Премахване на команда\n" "${C_KEY}${C_BOLD}" "${C_RESET}"
    printf "  %b[6]%b  ✏️  Редактиране на файла\n" "${C_KEY}${C_BOLD}" "${C_RESET}"
    printf "  %b[7]%b  ⚡ FZF интерактивен преглед\n" "${C_KEY}${C_BOLD}" "${C_RESET}"
    printf "  %b[8]%b  📖 Помощ\n" "${C_KEY}${C_BOLD}" "${C_RESET}"
    echo
    printf "  %b[q]%b  🚪 Изход\n" "${C_ERROR}${C_BOLD}" "${C_RESET}"
    echo

    printf "%b%s%b " "${C_PRIMARY}" "➤" "${C_RESET}"
    read -r choice

    case "$choice" in
        1) list_commands; read -rp "Натисни Enter за продължаване...";;
        2) add_command;;
        3) view_command;;
        4) search_commands;;
        5) remove_command;;
        6) edit_commands;;
        7) fzf_menu;;
        8) show_help;;
        q|Q)
            clear
            printf "\n%b%s%b\n\n" "${C_SUCCESS}${C_BOLD}" "👋 Довиждане!" "${C_RESET}"
            exit 0
            ;;
        *)
            printf "\n%b%s%b\n" "${C_ERROR}" "❌ Невалидна опция!" "${C_RESET}"
            sleep 1
            ;;
    esac
}

# Главен цикъл
while true; do
    main_menu
done