#!/bin/sh
# calista-proxy - Calista Component Proxy
# Лицензия: GPLv2+ (т.к. вызывает git)

CONFIG_DIR="/calista/config/gproxy"
CONFIG_FILE="$CONFIG_DIR/config"
CACHE_DIR="/calista/cache/gproxy"
COMPONENTS_CACHE="$CACHE_DIR/components.json"

# Проверяем наличие git
check_git() {
    if ! command -v git >/dev/null 2>&1; then
        echo "Ошибка: git не установлен" >&2
        exit 1
    fi
}

# Инициализация каталогов
init_dirs() {
    mkdir -p "$CONFIG_DIR" "$CACHE_DIR"
}

# Загрузка конфига
load_config() {
    if [ -f "$CONFIG_FILE" ]; then
        . "$CONFIG_FILE"
    else
        echo "Конфиг не найден. Сначала установите ссылку: $0 set-repo <git-url>" >&2
        exit 1
    fi
}

# Команда: установка ссылки на репозиторий компонентов
cmd_set_repo() {
    if [ -z "$1" ]; then
        echo "Использование: $0 set-repo <git-url>" >&2
        exit 1
    fi
    
    init_dirs
    echo "REPO_URL=\"$1\"" > "$CONFIG_FILE"
    echo "CACHE_DIR=\"$CACHE_DIR\"" >> "$CONFIG_FILE"
    echo "Ссылка сохранена: $1"
    
    # Обновляем кэш
    cmd_update
}

# Команда: обновление списка компонентов
cmd_update() {
    check_git
    load_config
    
    echo "Обновление списка компонентов из $REPO_URL"
    
    # Создаем временный каталог для клонирования
    TMP_DIR="$CACHE_DIR/tmp_repo"
    rm -rf "$TMP_DIR"
    
    # Клонируем репозиторий
    if git clone --depth 1 "$REPO_URL" "$TMP_DIR" 2>/dev/null; then
        # Ищем components.json
        if [ -f "$TMP_DIR/components.json" ]; then
            cp "$TMP_DIR/components.json" "$COMPONENTS_CACHE"
            echo "Список компонентов обновлен"
        elif [ -f "$TMP_DIR/component-list.json" ]; then
            cp "$TMP_DIR/component-list.json" "$COMPONENTS_CACHE"
            echo "Список компонентов обновлен"
        else
            echo "Ошибка: Не найден файл components.json в репозитории" >&2
        fi
        rm -rf "$TMP_DIR"
    else
        echo "Ошибка клонирования. Проверьте SSH ключи и доступ к $REPO_URL" >&2
        exit 1
    fi
}

# Поиск компонента в списке
find_component() {
    COMP_ID="$1"
    
    if [ ! -f "$COMPONENTS_CACHE" ]; then
        echo "Список компонентов не найден. Сначала выполните обновление: $0 update" >&2
        exit 1
    fi
    
    # Используем grep для простого парсинга JSON
    if grep -q "\"id\": \"$COMP_ID\"" "$COMPONENTS_CACHE"; then
        # Извлекаем репозиторий
        REPO=$(grep -A 10 "\"id\": \"$COMP_ID\"" "$COMPONENTS_CACHE" | \
               grep "\"repo\":" | head -1 | cut -d'"' -f4)
        echo "$REPO"
        return 0
    else
        echo ""
        return 1
    fi
}

# Команда: получение компонента
cmd_get() {
    if [ -z "$1" ]; then
        echo "Использование: $0 get <component-id> [version]" >&2
        echo "  version может быть: конкретный тег или 'latest'" >&2
        exit 1
    fi
    
    check_git
    load_config
    
    COMP_ID="$1"
    VERSION="${2:-latest}"
    
    echo "Поиск компонента: $COMP_ID версия: $VERSION"
    
    # Ищем компонент
    REPO_URL=$(find_component "$COMP_ID")
    if [ -z "$REPO_URL" ]; then
        echo "Компонент '$COMP_ID' не найден" >&2
        exit 1
    fi
    
    # Определяем цель клонирования
    TARGET_DIR="$CACHE_DIR/$COMP_ID"
    if [ -n "$2" ] && [ "$2" != "latest" ]; then
        TARGET_DIR="$CACHE_DIR/${COMP_ID}_$2"
    fi
    
    # Удаляем старую копию если существует
    if [ -d "$TARGET_DIR" ]; then
        echo "Удаление старой версии..."
        rm -rf "$TARGET_DIR"
    fi
    
    # Клонируем компонент
    echo "Клонирование: $REPO_URL"
    if [ "$VERSION" = "latest" ]; then
        if git clone "$REPO_URL" "$TARGET_DIR"; then
            echo "Компонент '$COMP_ID' склонирован в: $TARGET_DIR"
        else
            echo "Ошибка клонирования. Проверьте SSH ключи и доступ" >&2
            exit 1
        fi
    else
        # Клонируем с конкретным тегом
        if git clone --branch "$VERSION" "$REPO_URL" "$TARGET_DIR"; then
            echo "Компонент '$COMP_ID' версии $VERSION склонирован в: $TARGET_DIR"
        else
            echo "Ошибка: Не удалось клонировать версию $VERSION" >&2
            echo "Возможно тег не существует или проблемы с доступом" >&2
            exit 1
        fi
    fi
}

# Команда: список доступных компонентов
cmd_list() {
    if [ ! -f "$COMPONENTS_CACHE" ]; then
        echo "Список компонентов не найден. Сначала выполните: $0 update" >&2
        exit 1
    fi
    
    echo "Доступные компоненты:"
    echo "====================="
    
    # Простой парсинг для вывода списка
    grep '"id":' "$COMPONENTS_CACHE" | cut -d'"' -f4 | while read -r id; do
        name=$(grep -A 2 "\"id\": \"$id\"" "$COMPONENTS_CACHE" | \
               grep '"name":' | head -1 | cut -d'"' -f4)
        echo "  $id - $name"
    done
}

# Команда: очистка кэша
cmd_clean() {
    load_config
    
    echo "Очистка кэша в $CACHE_DIR"
    
    # Удаляем все кроме конфига и самого файла components.json
    find "$CACHE_DIR" -mindepth 1 -maxdepth 1 -type d -exec rm -rf {} + 2>/dev/null
    rm -f "$COMPONENTS_CACHE"
    
    echo "Кэш очищен"
}

# Команда: установка пути к хранилищу
cmd_set_cache() {
    if [ -z "$1" ]; then
        echo "Использование: $0 set-cache <путь>" >&2
        exit 1
    fi
    
    NEW_CACHE="$1"
    if [ ! -d "$NEW_CACHE" ]; then
        mkdir -p "$NEW_CACHE" || {
            echo "Не удалось создать каталог: $NEW_CACHE" >&2
            exit 1
        }
    fi
    
    # Обновляем конфиг
    if [ -f "$CONFIG_FILE" ]; then
        grep -v "^CACHE_DIR=" "$CONFIG_FILE" > "$CONFIG_FILE.tmp"
        echo "CACHE_DIR=\"$NEW_CACHE\"" >> "$CONFIG_FILE.tmp"
        mv "$CONFIG_FILE.tmp" "$CONFIG_FILE"
    else
        echo "CACHE_DIR=\"$NEW_CACHE\"" > "$CONFIG_FILE"
    fi
    
    CACHE_DIR="$NEW_CACHE"
    COMPONENTS_CACHE="$CACHE_DIR/components.json"
    
    echo "Путь к хранилищу установлен: $NEW_CACHE"
}

# Команда: помощь
cmd_help() {
    echo "Calista Component Proxy"
    echo "======================="
    echo "Команды:"
    echo "  set-repo <git-url>    - Установить ссылку на репозиторий компонентов"
    echo "  update                - Обновить список компонентов"
    echo "  list                  - Показать список доступных компонентов"
    echo "  get <id> [version]    - Получить компонент (version может быть тегом или 'latest')"
    echo "  clean                 - Очистить кэш склонированных репозиториев"
    echo "  set-cache <path>      - Установить путь к хранилищу"
    echo "  help                  - Показать эту справку"
    echo ""
    echo "Примеры:"
    echo "  $0 set-repo git@github.com:user/components.git"
    echo "  $0 update"
    echo "  $0 get cpm v1.0.0"
    echo "  $0 get calista-graphics-legacy latest"
}

# Главная функция
main() {
    case "$1" in
        set-repo)
            cmd_set_repo "$2"
            ;;
        update)
            cmd_update
            ;;
        get)
            cmd_get "$2" "$3"
            ;;
        list)
            cmd_list
            ;;
        clean)
            cmd_clean
            ;;
        set-cache)
            cmd_set_cache "$2"
            ;;
        help|--help|-h)
            cmd_help
            ;;
        *)
            if [ -z "$1" ]; then
                cmd_help
            else
                echo "Неизвестная команда: $1" >&2
                echo "Используйте: $0 help" >&2
                exit 1
            fi
            ;;
    esac
}

# Запуск
main "$@"
