#!/usr/bin/env ruby
# frozen_string_literal: true

# vim: set syntax=ruby

# kettle-pre-release: Run pre-release checks to catch avoidable mistakes.
# - Structured as a sequence of checks that can be resumed via check_num
# - Checks GitHub Actions SHA pins, normalizes Markdown image URLs, and
#   validates Markdown image links with a global seven-day success cache.

require "optparse"

# Immediate, unbuffered output
$stdout.sync = true
$stderr.sync = true

# Do not rely on Bundler; allow running in repos that do not depend on kettle-dev
# Ensure RubyGems is available for 'require' lookups
begin
  require "rubygems"
rescue LoadError
  # Older Rubies always have rubygems; continue anyway
end

script_basename = File.basename(__FILE__)
repo_lib = File.expand_path("../lib", __dir__)
$LOAD_PATH.unshift(repo_lib) if File.directory?(repo_lib) && !$LOAD_PATH.include?(repo_lib)

begin
  require "kettle/dev"
  require "kettle/dev/executable_version"
  Kettle::Dev::ExecutableVersion.print_and_exit!(script_basename, ARGV)
  Kettle::Dev::ExecutableVersion.print_header(script_basename)
rescue => e
  warn("#{script_basename}: could not load dependency: #{e.class}: #{e.message}")
  warn("Hint: Ensure the host project has kettle-dev as a dependency and run bundle install.")
  exit(1)
end

# Option parsing
options = {
  check_num: 1
}

parser = OptionParser.new do |opts|
  opts.banner = "Usage: kettle-pre-release [options]"
  opts.on("--check-num N", Integer, "Start from check number N (1-based)") { |v| options[:check_num] = v }
  opts.on("-cN", Integer, "Alias for --check-num N") { |v| options[:check_num] = v }
  opts.on("-h", "--help", "Show this help") do
    puts opts
    puts
    puts "Checks:"
    puts "  1) Validate GitHub Actions SHA pins"
    puts "  2) Normalize Markdown image URLs"
    puts "  3) Validate Markdown image links (cached HTTP HEAD, with GET fallback)"
    puts
    puts "Image URL cache:"
    puts "  Successful image URL validations are cached globally for seven days."
    puts "  KETTLE_IMAGE_URL_CACHE=/path/to/cache.json  Use a custom cache path"
    puts "  KETTLE_IMAGE_URL_CACHE=false                Disable the image URL cache"
    puts "  KETTLE_IMAGE_URL_CACHE_REFRESH=true         Ignore cached successes and refresh"
    puts
    puts "GitHub Actions pin cache:"
    puts "  Live cache validation is the default and refreshes stale entries from GitHub."
    puts "  KETTLE_PRE_RELEASE_GHA_SHA_PINS_OFFLINE=true  Trust the persistent pin cache without network access"
    exit(0)
  end
end

begin
  parser.parse!(ARGV)
rescue OptionParser::ParseError => e
  warn("#{script_basename}: #{e.message}")
  puts parser
  exit(2)
end

# Execute
# Build and run CLI in the same style as kettle-release
cli = Kettle::Dev::PreReleaseCLI.new(check_num: options[:check_num])
cli.run

puts "== #{script_basename} complete =="
