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

require "open3"
require "pathname"
require "yaml"

require "net/http"
require "uri"

def verify_appcast(appcast_type, *urls)
  print "Looking for #{appcast_type} appcast… "

  urls.each do |url|
    next unless url_exist?(url)

    puts "Found!"
    puts "  #{url}"
    return true
  end

  puts "Not found."
  false
end

def url_exist?(url)
  return false unless url

  system("curl", "--silent", "--location", "--fail", url, out: File::NULL)
end

def find_sparkle(app)
  plist = app.join("Contents/Info.plist")
  url = Open3.capture3("defaults", "read", plist.to_path, "SUFeedURL").first.strip

  verify_appcast("Sparkle", url)
end

def find_electron_builder(app)
  appcast_file = app.join("Contents/Resources/app-update.yml")

  unless appcast_file.exist?
    verify_appcast("electron-builder", false)
    return false
  end

  data = YAML.load_file(appcast_file)
  bucket = data["bucket"]
  channel = data["channel"]
  endpoint = data["endpoint"]
  name = data["name"]
  owner = data["owner"]
  path = data["path"]
  region = data["region"]
  repo = data["repo"]
  url = data["url"]

  possible_appcasts = [
    "#{url}/latest-mac.yml",
    "#{url}/updates/latest/mac/latest-mac.yml",
    "https://github.com/#{owner}/#{repo}/releases.atom",
    "https://#{bucket}.s3.amazon-aws.yml/#{channel}/latest-mac.yml",
    "https://#{bucket}.s3.amazonaws.com/latest-mac.yml",
    "https://#{bucket}.s3.amazonaws.com/#{path}/latest-mac.yml",
    "https://s3-#{region}.amazonaws.com/#{bucket}/#{path}/latest-mac.yml",
    "https://s3.amazonaws.com/#{bucket}/#{path}/latest-mac.yml",
    "https://#{name}.#{region}.digitaloceanspaces.com/latest-mac.yml",
    "https://#{name}.#{region}.digitaloceanspaces.com/#{path}/latest-mac.yml",
    "#{endpoint}/#{bucket}/#{path}/latest-mac.yml",
  ].map do |appcast|
    # Collapse groups of two or more forward slashes into one, except when preceded by a colon
    appcast.gsub(%r{(?<!:)/{2,}}, "/")
  end

  return if verify_appcast("electron-builder", *possible_appcasts)

  warn <<~MESSAGE

    An "app-update.yml" file was found, but we could not parse it.
    Please report this on https://github.com/Homebrew/homebrew-cask/
    Provide this info:

  MESSAGE

  puts appcast_file.read
end

App = Pathname(ARGV[0]).freeze

find_sparkle(App)
find_electron_builder(App)
