# Blueprint info:
#   Link: https://avohq.io/blueprints/webhukhs
#   Repository: https://github.com/avo-hq/webhukhs-app-blueprint

# List of all Avo files with path and contents
files = {"app/avo/filters/webhukhs_handler.rb" => "class Avo::Filters::WebhukhsHandler < Avo::Filters::SelectFilter\n  self.name = \"Handler\"\n\n  def apply(request, query, value)\n    query.where(handler_module_name: value)\n  end\n\n  def options\n    Webhukhs::ReceivedWebhook.distinct.order(:handler_module_name).pluck(:handler_module_name).index_with(&:itself)\n  end\nend\n", "app/avo/filters/webhukhs_status.rb" => "class Avo::Filters::WebhukhsStatus < Avo::Filters::SelectFilter\n  self.name = \"Status\"\n\n  def apply(request, query, value)\n    query.where(status: value)\n  end\n\n  def options\n    Webhukhs::ReceivedWebhook.statuses.keys.index_with(&:humanize)\n  end\nend\n", "app/avo/resources/webhukhs_received_webhook.rb" => "class Avo::Resources::WebhukhsReceivedWebhook < Avo::BaseResource\n  self.model_class = \"Webhukhs::ReceivedWebhook\"\n  self.title = :handler_event_id\n  self.record_selector = false\n  self.default_sort_column = :id\n  self.default_sort_direction = :desc\n\n  def fields\n    field :id, as: :id, sortable: true\n    field :handler_module_name, as: :text, name: \"Handler\"\n    field :handler_event_id, as: :text, name: \"Event ID\"\n    field :status, as: :badge, options: {\n      success: [\"processed\"],\n      warning: [\"received\", \"processing\"],\n      danger: [\"error\", \"failed_validation\"],\n      neutral: [\"skipped\"]\n    }\n    field :created_at, as: :date_time, name: \"Received at\"\n    field :updated_at, as: :date_time\n    field :body, as: :code, name: \"Payload\", language: \"javascript\",\n      always_show: true, height: \"300px\",\n      help: \"Display limited to 256 KiB. Invalid UTF-8 is replaced for display only. The stored payload is unchanged.\" do\n      body = record.body\n      text = body.byteslice(0, 256 * 1024).dup.force_encoding(Encoding::UTF_8).scrub\n\n      if body.bytesize > 256 * 1024\n        \"\#{text}\n[Payload truncated for display]\"\n      else\n        begin\n          JSON.pretty_generate(JSON.parse(text))\n        rescue JSON::ParserError\n          text\n        end\n      end\n    end\n    field :request_headers, as: :code, language: \"javascript\", always_show: true, height: \"200px\" do\n      JSON.pretty_generate(record.request_headers || {})\n    end\n  end\n\n  def filters\n    filter Avo::Filters::WebhukhsStatus\n    filter Avo::Filters::WebhukhsHandler\n  end\n\n  # Use the core controls so the blueprint also works without paid add-ons.\n  def render_index_controls(item:)\n    []\n  end\n\n  def render_show_controls\n    [Avo::Resources::Controls::BackButton.new]\n  end\n\n  def render_row_controls(item:)\n    [Avo::Resources::Controls::ShowButton.new(item: item)]\n  end\nend\n", "app/controllers/avo/webhukhs_received_webhooks_controller.rb" => "class Avo::WebhukhsReceivedWebhooksController < Avo::ResourcesController\n  prepend_before_action :require_read_only_request\n\n  private\n\n  def require_read_only_request\n    head :forbidden unless request.get? && action_name.in?([\"index\", \"show\"])\n  end\nend\n"}

unless defined?(Avo) && defined?(Webhukhs::ReceivedWebhook)
  abort "Install Avo and Webhukhs, then run webhukhs:install and db:migrate before applying this blueprint."
end

files.each do |path, contents|
  file path, contents
end

say "Webhukhs is ready at your Avo mount path under /resources/webhukhs_received_webhooks."
say "Keep Avo behind admin authentication. Webhook bodies and headers may contain secrets."
