# get ports from nginx proxy
function _ports(){
grep -E "set .port|server_name" /app/nginxproxy/data/nginx/proxy_host/*.conf \
  | sed 's/^[ \t]*//; s/.*conf://' \
  | paste - - \
  | sed 's/set \$port //; s/server_name //; s/;//g' \
  | awk '{$1=$1; print}' \
  | sort -n \
  | column -t -N "PORT,TARGET,OTHER_TARGET" -W "OTHER_TARGET" -s ' ' -o ' | ';
}
alias nginx='_ports'

# tmp rebuild for hugo development
alias hugo-rebuild='rm -rf public/ && hugo server --appendPort=false --baseURL="/" --ignoreCache'

# helpers for quickly editing aliases
alias src='source ~/.bash_aliases'
alias edit='vim /srv/configs/.bash_aliases'

# Docker Image Version Tag checker
function _tagger() {
    if [ -z "$1" ]; then
        echo "Usage: tag <image>:<tag>"
        return 1
    fi

    # Split image and tag safely
    local INPUT="$1"
    local REPO="${INPUT%%:*}"
    local TAG="${INPUT##*:}"
    
    # If no tag provided, default to latest
    [ "$REPO" = "$TAG" ] && TAG="latest"

    # Handle official library images
    local API_REPO="$REPO"
    [[ "$REPO" != *"/"* ]] && API_REPO="library/$REPO"

    # 1. Grab the exact unique digest for the target tag
    local DIGEST
    DIGEST=$(curl -s "https://hub.docker.com/v2/repositories/${API_REPO}/tags/${TAG}" | jq -r '.digest // empty')

    if [ -z "$DIGEST" ] || [ "$DIGEST" = "null" ]; then
        echo "Error: Image or tag not found on Docker Hub."
        return 1
    fi

    # 2. Get the sibling tag sharing the same digest, skipping text labels
    local VERSION
    VERSION=$(curl -s "https://hub.docker.com/v2/repositories/${API_REPO}/tags/?page_size=100" \
        | jq -r --arg dig "$DIGEST" \
        '.results[] | select(.digest == $dig) | .name' \
        | grep -E -v 'latest|alpine|slim|debian|bullseye|bookworm|ubuntu|test|rc|nightly' \
        | head -n 1)

    # 3. Output results
    if [ -n "$VERSION" ]; then
        echo "${REPO}:${VERSION}"
    else
        echo "${REPO}:${TAG}"
    fi
}
alias tag='_tagger'

# docker services
function _docker-table() {
    if ! docker info > /dev/null 2>&1; then
        echo "Error: Docker daemon is not running."
        return 1
    fi

    (
        # 1. Adjusted Header to match your 3 requested columns
        printf "NAME|STATUS|EXPOSED PORTS\n"
        
        # 2. Match the format string to exactly what you are reading
        docker ps -a --format "{{.Names}}|{{.Status}}|{{.Ports}}" | while IFS='|' read -r name status ports; do
            if [ -n "$ports" ]; then
                # Split ports strictly by comma
                IFS=',' read -r -a port_array <<< "$ports"
                cleaned_ports=""
                
                for p in "${port_array[@]}"; do
                    # Trim any leading/trailing spaces from the array element
                    p=$(echo "$p" | xargs)
                    
                    # Strip everything up to and including '->' if it exists
                    cleaned_p="${p##*->}"
                    
                    # Prevent duplicate listings (e.g. if IPv4 and IPv6 both map to 8080/tcp)
                    if [[ ", $cleaned_ports, " != *", $cleaned_p, "* ]]; then
                        if [ -z "$cleaned_ports" ]; then
                            cleaned_ports="$cleaned_p"
                        else
                            cleaned_ports="$cleaned_ports, $cleaned_p"
                        fi
                    fi
                done
                ports="$cleaned_ports"
            fi
            
            # Print the 3 columns cleanly
            printf "%s|%s|%s\n" "$name" "$status" "$ports"
        done
    ) | column -t -s '|'
}
alias docker-services='_docker-table'
