#!/usr/bin/env ruby
#
# Fetches Stripe development environment variables from 1Password and starts
# the Stripe CLI webhook listener.
#
# Usage: eval "$(bundle exec stripe-dev)"

require "json"
require "fileutils"

LOG_FILE = "log/stripe.development.log"
PID_FILE = "tmp/stripe.tunnel.pid"

# Ensure directories exist
FileUtils.mkdir_p("log")
FileUtils.mkdir_p("tmp")

# Kill any existing stripe tunnel process
if File.exist?(PID_FILE)
  old_pid = File.read(PID_FILE).strip.to_i
  if old_pid > 0
    Process.kill("TERM", old_pid) rescue nil
  end
  File.delete(PID_FILE)
end

# Fetch secrets from 1Password
secrets_escaped = `kamal secrets fetch \
  --adapter 1password \
  --account basecamp \
  --from "Deploy/Fizzy" \
  "Development/STRIPE_SECRET_KEY" \
  "Development/STRIPE_MONTHLY_V1_PRICE_ID" 2>/dev/null`

secrets_json = secrets_escaped.gsub(/\\(.)/, '\1')
secrets = JSON.parse(secrets_json)

stripe_secret_key = secrets["Deploy/Fizzy/Development/STRIPE_SECRET_KEY"]
stripe_price_id = secrets["Deploy/Fizzy/Development/STRIPE_MONTHLY_V1_PRICE_ID"]

# Clear previous log file
File.write(LOG_FILE, "")

# Start stripe listen in background
pid = spawn(
  "stripe", "listen", "--forward-to", "localhost:3006/stripe/webhooks",
  out: [ LOG_FILE, "a" ],
  err: [ LOG_FILE, "a" ]
)
Process.detach(pid)

# Save PID for cleanup
File.write(PID_FILE, pid.to_s)

# Wait for the webhook secret to appear in logs
webhook_secret = nil
20.times do
  sleep 0.5
  if File.exist?(LOG_FILE)
    content = File.read(LOG_FILE)
    if match = content.match(/webhook signing secret is (whsec_\w+)/)
      webhook_secret = match[1]
      break
    end
  end
end

if webhook_secret.nil?
  warn "Warning: Could not capture webhook secret from stripe listen"
end

# Output export statements
puts %Q(export STRIPE_SECRET_KEY="#{stripe_secret_key}")
puts %Q(export STRIPE_MONTHLY_V1_PRICE_ID="#{stripe_price_id}")
puts %Q(export STRIPE_WEBHOOK_SECRET="#{webhook_secret}") if webhook_secret

# Informational message to stderr (won't be eval'd)
warn ""
warn "Stripe CLI listening (PID: #{pid})"
warn "Logs: #{LOG_FILE}"
