#!/bin/bash

# Colors for output
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# Log file
LOG_FILE="publish_dependencies.log"

# Function to log messages
log() {
    local message="$1"
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo -e "${timestamp} - ${message}" | tee -a "$LOG_FILE"
}

# Function to check if a package is already published
check_published() {
    local package_name="$1"
    local version="$2"
    
    if cargo search "$package_name" | grep -q "^$package_name = \"$version\""; then
        return 0
    fi
    return 1
}

# Function to publish a package
publish_package() {
    local package_name="$1"
    local version="$2"
    local path="$3"
    
    log "${YELLOW}Checking if $package_name v$version is already published...${NC}"
    
    if check_published "$package_name" "$version"; then
        log "${GREEN}$package_name v$version is already published. Skipping...${NC}"
        return 0
    fi
    
    log "${YELLOW}Publishing $package_name v$version from $path...${NC}"
    
    if cd "$path" && cargo publish; then
        log "${GREEN}Successfully published $package_name v$version${NC}"
        return 0
    else
        log "${RED}Failed to publish $package_name v$version${NC}"
        return 1
    fi
}

# Level 0: Basic dependencies (no dependencies)
LEVEL_0_PACKAGES=(
    "solana-program:1.17.0:../solana-program"
    "solana-program-test:1.17.0:../solana-program-test"
)

# Level 1: Dependencies on level 0
LEVEL_1_PACKAGES=(
    "solana-sdk:1.17.0:../sdk"
    "solana-account-decoder:1.17.0:../account-decoder"
)

# Level 2: Dependencies on level 1
LEVEL_2_PACKAGES=(
    "solana-transaction-status:1.17.0:../transaction-status"
    "solana-client:1.17.0:../client"
)

# Level 3: Dependencies on level 2
LEVEL_3_PACKAGES=(
    "solana-rpc:1.17.0:../rpc"
    "solana-rpc-client:1.17.0:../rpc-client"
)

# Level 4: Dependencies on level 3
LEVEL_4_PACKAGES=(
    "solana-program-runtime:1.17.0:../program-runtime"
    "solana-program:1.17.0:../program"
)

# Level 5: Final dependencies
LEVEL_5_PACKAGES=(
    "solana-program-entrypoint:1.17.0:."
)

# Function to publish a level of packages
publish_level() {
    local level_name="$1"
    shift
    local packages=("$@")
    
    log "${YELLOW}Starting to publish $level_name packages...${NC}"
    
    for package in "${packages[@]}"; do
        IFS=':' read -r name version path <<< "$package"
        if ! publish_package "$name" "$version" "$path"; then
            log "${RED}Failed to publish $name. Stopping process.${NC}"
            return 1
        fi
        log "${YELLOW}Waiting 60 seconds before next publication...${NC}"
        sleep 60
    done
    
    log "${GREEN}Successfully published all $level_name packages${NC}"
    return 0
}

# Main publishing process
log "${YELLOW}Starting package publication process...${NC}"

# Publish each level in sequence
if ! publish_level "Level 0" "${LEVEL_0_PACKAGES[@]}"; then exit 1; fi
if ! publish_level "Level 1" "${LEVEL_1_PACKAGES[@]}"; then exit 1; fi
if ! publish_level "Level 2" "${LEVEL_2_PACKAGES[@]}"; then exit 1; fi
if ! publish_level "Level 3" "${LEVEL_3_PACKAGES[@]}"; then exit 1; fi
if ! publish_level "Level 4" "${LEVEL_4_PACKAGES[@]}"; then exit 1; fi
if ! publish_level "Level 5" "${LEVEL_5_PACKAGES[@]}"; then exit 1; fi

log "${GREEN}All packages have been published successfully!${NC}"
log "${YELLOW}Please check the log file ($LOG_FILE) for details.${NC}" 