#!/bin/sh

# CPM - Calista Package Manager
# Версия: 1.2

# Проверяем, установлен ли pkg
if ! command -v pkg >/dev/null 2>&1; then
    echo "Ошибка: pkg не установлен или не найден в PATH" >&2
    exit 1
fi

# Функция для фильтрации стандартных пакетов FreeBSD
filter_freebsd_packages() {
    pkg info | grep -v '^FreeBSD-'
}

# Функция для получения списка пользовательских пакетов (корневых)
get_custom_packages() {
    filter_freebsd_packages | awk '{print $1}'
}

# Функция для получения имен всех установленных пакетов
get_all_packages() {
    pkg info | awk '{print $1}'
}

# Обработка команд
case "$1" in
    "info")
        if [ "$2" = "-v" ]; then
            # Подробная информация о каждом пользовательском пакете
            get_custom_packages | while read -r package; do
                echo "=== Информация о пакете: $package ==="
                pkg info "$package"
                echo ""
            done
        elif [ "$2" = "-dtree" ]; then
            echo "Вывод всего дерева зависимостей является ресурсозатратной операцией"
            printf "Вы уверены? [y/N] "
            read REPLY

            if echo "$REPLY" | grep -iq "^y"; then
                get_custom_packages | while read -r package; do
                    deptree -s "$package"
                    echo ""
                done
            else
                echo "Пока"
                exit 1
            fi
        else
            # Простой список пользовательских пакетов
            filter_freebsd_packages
        fi
        ;;

    "deptree")
        deptree -s "$2"
        ;;

    "install")
        if [ -z "$2" ]; then
            echo "Использование: cpm install <имя_пакета>" >&2
            exit 1
        fi
        shift
        pkg install "$@"
        ;;

    "delete"|"remove")
        if [ -z "$2" ]; then
            echo "Использование: cpm $1 <имя_пакета>" >&2
            exit 1
        fi
        shift
        pkg delete "$@"
        ;;

    "autoremove")
        pkg autoremove
        ;;

    "upgrade")
        pkg upgrade
        ;;

    "update")
        pkg update
        ;;

    "search")
        if [ -z "$2" ]; then
            echo "Использование: cpm search <запрос>" >&2
            exit 1
        fi
        shift
        pkg search "$@"
        ;;

    "clean")
        pkg clean
        ;;

    "version"|"-v"|"--version")
        echo "CPM - Calista Package Manager wrapper v1.2"
        echo "Использует: $(pkg -v)"
        ;;

    "help"|"-h"|"--help")
        cat << EOF
CPM - Calista Package Manager

Использование: cpm <команда> [опции]

Команды:
  info               Список установленных пакетов (без стандартных FreeBSD)
  info -v            Подробная информация о всех пользовательских пакетах
  info -dtree        Дерево зависимостей пользовательских пакетов
  deptree <пакет>    Полное дерево зависимостей для конкретного пакета
  install <пакет>    Установить пакет
  delete <пакет>     Удалить пакет
  autoremove         Удалить неиспользуемые зависимости
  upgrade            Обновить все пакеты
  update             Обновить репозиторий пакетов
  search <запрос>    Поиск пакетов
  clean              Очистить кэш пакетов
  version            Показать версию
  help               Показать эту справку

Примеры:
  cpm info
  cpm info -v
  cpm info -dtree
  cpm deptree nano
  cpm install nano
  cpm delete nano
  cpm search python
EOF
        ;;

    *)
        if [ -z "$1" ]; then
            echo "Использование: cpm <команда>" >&2
            echo "Для справки: cpm help" >&2
            exit 1
        else
            echo "Неизвестная команда: $1" >&2
            echo "Для справки: cpm help" >&2
            exit 1
        fi
        ;;
esac

exit 0
