#!/bin/bash
# Omarchy Repository Database Manager
# Updates the repository database with all packages

set -e

# Source common functions
BUILD_ROOT=$(realpath "${BASH_SOURCE[0]%/*}/..")
source "$BUILD_ROOT/helpers/message-helpers.sh"
source "$BUILD_ROOT/helpers/docker-helpers.sh"
source "$BUILD_ROOT/helpers/paths.sh"
source "$BUILD_ROOT/helpers/lock-helpers.sh"

# Function to update repository database using the selected container engine
update_database() {
  print_info "Updating repository database in a container..."

  check_engine

  # Ensure output directory exists
  if [[ ! -d "$REPO_DIR" ]]; then
    print_error "Output directory not found: $REPO_DIR"
    print_warning "Run bin/repo build first"
    exit 1
  fi

  if [[ "$CONTAINER_ENGINE" == "docker" ]]; then
    make_dir_writable "$REPO_DIR"
  fi

  # repo-add is architecture- and mirror-independent. Use the host-native edge
  # image, which also lets bootstrap-rc run before that channel exists remotely.
  local tool_arch
  tool_arch=$(docker_native_arch) || {
    print_error "Unsupported host architecture: $(uname -m)"
    exit 1
  }
  build_docker_image "$BUILD_DIR" "$tool_arch" "edge"

  "$CONTAINER_ENGINE" run "${CONTAINER_RUN_ARGS[@]}" --rm "$(get_platform_arg "$tool_arch")" \
    -e ARCH="$ARCH" \
    -e MIRROR="$MIRROR" \
    -v "$REPO_ROOT:/output" \
    -v "$BUILD_DIR:/build:ro" \
    "omarchy-pkg-builder:latest-$tool_arch-edge" /build/update-repo.sh
}

# Main execution
main() {
  print_header "Omarchy Repository Database Manager"

  # Parse command line arguments
  while [[ $# -gt 0 ]]; do
    case $1 in
    --arch)
      ARCH="$2"
      update_arch_paths
      shift 2
      ;;
    --mirror)
      MIRROR="$2"
      require_valid_mirror "$MIRROR"
      update_arch_paths
      shift 2
      ;;
    -h | --help)
      echo "Usage: $0 [OPTIONS]"
      echo ""
      echo "Options:"
      echo "  --arch <arch>      Target architecture (x86_64 or aarch64, default: x86_64)"
      echo "  --mirror <mirror>  Mirror to use (edge, rc, or stable, default: edge)"
      echo "  -h, --help         Show this help message"
      exit 0
      ;;
    *)
      print_error "Unknown option: $1"
      exit 1
      ;;
    esac
  done

  print_info "Target architecture: $ARCH"
  print_info "Mirror: $MIRROR"
  print_info "Output directory: $REPO_DIR"

  acquire_release_lock || exit 1

  update_database

  echo ""
  print_success "Repository update complete!"
}

# Run main function
main "$@"
