class Scaffolding::IncomingWebhooksTransformer

def initialize(provider_name, cli_options = {})

def initialize(provider_name, cli_options = {})
  super("", "", cli_options)
  self.provider_name = provider_name
end

def replacement_for(string)

def replacement_for(string)
  case string
  when "bullet_train_webhook"
    "#{provider_name.tableize.singularize}_webhook"
  when "bullet_train_webhooks"
    "#{provider_name.tableize.singularize}_webhooks"
  when "Webhooks::Incoming::BulletTrainWebhook"
    "Webhooks::Incoming::#{provider_name}Webhook"
  end
end

def scaffold_incoming_webhook

def scaffold_incoming_webhook
  files = [
    "./app/models/webhooks/incoming/bullet_train_webhook.rb",
    "./app/controllers/webhooks/incoming/bullet_train_webhooks_controller.rb",
    "./test/controllers/webhooks/incoming/bullet_train_webhooks_controller_test.rb"
  ]
  files.each do |name|
    if File.directory?(resolve_template_path(name))
      scaffold_directory(name)
    else
      scaffold_file(name)
    end
  end
  file_name_hook = "bullet_train_webhook"
  new_model_file_name, _ = files.map { |file| file.gsub(file_name_hook, replacement_for(file_name_hook)) }
  # Set up the model's `verify_authenticity` method to return `true`.
  model_file_lines = File.readlines(new_model_file_name)
  comment_lines = [
    "# You can implement your authenticity verification logic in either\n",
    "# the newly scaffolded model or controller for your incoming webhooks.\n"
  ]
  lines_to_ignore = [
    "  # there are many ways a service might ask you to verify the validity of a webhook.\n",
    "  # whatever that method is, you would implement it here.\n"
  ]
  model_file_lines = File.readlines(new_model_file_name)
  new_model_file_lines = File.open(new_model_file_name).map.with_index do |line, idx|
    if line.match?("def verify_authenticity")
      indentation = Scaffolding::BlockManipulator.indentation_of(idx, model_file_lines)
      new_comment_lines = comment_lines.map { |comment_line| "#{indentation}#{comment_line}" }.join
      new_comment_lines +
        "#{line}" \
        "#{indentation}  true\n"
    elsif lines_to_ignore.include?(line)
      next
    else
      line
    end
  end
  Scaffolding::FileManipulator.write(new_model_file_name, new_model_file_lines)
  # Apply new routes
  begin
    [
      "config/routes.rb",
      # "config/routes/api/v1.rb"
    ].each do |routes_file|
      # Since the webhooks routes don't live under a parent resource, we can't use the `apply` method to apply routes.
      routes_manipulator = Scaffolding::RoutesFileManipulator.new(routes_file, "", "")
      resources_line = "  resources :#{replacement_for("bullet_train_webhooks")}"
      new_routes_lines = Scaffolding::BlockManipulator.insert(resources_line, lines: routes_manipulator.lines, after: "namespace :incoming")
      Scaffolding::FileManipulator.write(routes_file, new_routes_lines)
    end
  rescue BulletTrain::SuperScaffolding::CannotFindParentResourceException => exception
    add_additional_step :red, "We were not able to generate the routes for your Incoming Webhook automatically because: \"#{exception.message}\" You'll need to add them manually, which admittedly can be complicated. See https://blog.bullettrain.co/nested-namespaced-rails-routing-examples/ for guidance. 🙇🏻‍♂️"
  end
end

def transform_string(string)

def transform_string(string)
  [
    "bullet_train_webhook",
    "Webhooks::Incoming::BulletTrainWebhook"
  ].each do |needle|
    string = string.gsub(needle, replacement_for(needle))
  end
  string
end