#!/usr/bin/env bash

# Library script to read release assets configuration
# Usage: source .github/scripts/release/lib-release-config.sh

readonly RELEASE_CONFIG_FILE=".github/assets/release-assets-config.json"

# Get list of all binary filenames
get_all_binaries() {
  jq -r '.platforms[].binary' "$RELEASE_CONFIG_FILE"
}

# Get total binary count (computed from platforms array)
get_binary_count() {
  jq -r '.platforms | length' "$RELEASE_CONFIG_FILE"
}

# Get total expected file count (computed: binaries + archives + additional files)
get_total_file_count() {
  jq -r '
    (.platforms | length) as $binaries |
    (.archive_formats | length) as $formats |
    (.additional_files | length) as $additional |
    $binaries + ($binaries * $formats) + $additional
  ' "$RELEASE_CONFIG_FILE"
}

# Get list of archive extensions
get_archive_extensions() {
  jq -r '.archive_formats[].extension' "$RELEASE_CONFIG_FILE"
}

# Get list of additional files
get_additional_files() {
  jq -r '.additional_files[].name' "$RELEASE_CONFIG_FILE"
}

# Generate expected files list (for verification)
get_all_expected_files() {
  local binaries

  # Get binaries
  binaries=$(get_all_binaries)

  # Generate list: binaries + archives + additional files
  echo "$binaries"

  # Add archives for each binary
  for binary in $binaries; do
    while IFS= read -r ext; do
      echo "${binary}.${ext}"
    done < <(get_archive_extensions)
  done

  # Add additional files
  get_additional_files

  return 0
}

# Get platform info as JSON for a specific binary
get_platform_info() {
  local binary="$1"
  jq --arg binary "$binary" '.platforms[] | select(.binary == $binary)' "$RELEASE_CONFIG_FILE"
}

# Generate markdown table rows for summary
generate_platform_table_rows() {
  jq -r '.platforms[] | "| \(.os | ascii_downcase) | \(.arch) | \(if .signed then "Yes" else "No" end) | Uploaded |"' "$RELEASE_CONFIG_FILE" |
  awk '{
    # Capitalize first letter of OS
    if ($2 == "darwin") $2 = "macOS"
    else if ($2 == "linux") $2 = "Linux"
    else if ($2 == "windows") $2 = "Windows"
    print
  }'
}

# Check if config file exists
verify_config_file() {
  if [[ ! -f "$RELEASE_CONFIG_FILE" ]]; then
    echo "ERROR: Release config file not found: $RELEASE_CONFIG_FILE" >&2
    return 1
  fi

  return 0
}
