class Provider::PlaidSandbox < Provider::Plaid
  attr_reader :client

  def initialize
    @client = create_client
    @region = :us
  end

  def create_public_token(username: nil)
    client.sandbox_public_token_create(
      Plaid::SandboxPublicTokenCreateRequest.new(
        institution_id: "ins_109508", # "First Platypus Bank" (Plaid's sandbox institution that works with all products)
        initial_products: [ "transactions", "investments", "liabilities" ],
        options: {
          override_username: username || "custom_test"
        }
      )
    ).public_token
  end

  def fire_webhook(item, type: "TRANSACTIONS", code: "SYNC_UPDATES_AVAILABLE")
    client.sandbox_item_fire_webhook(
      Plaid::SandboxItemFireWebhookRequest.new(
        access_token: item.access_token,
        webhook_type: type,
        webhook_code: code,
      )
    )
  end

  def reset_login(item)
    client.sandbox_item_reset_login(
      Plaid::SandboxItemResetLoginRequest.new(
        access_token: item.access_token
      )
    )
  end

  private
    def create_client
      raise "Plaid sandbox is not supported in production" if Rails.env.production?

      Provider::PlaidAdapter.ensure_configuration_loaded

      api_client = Plaid::ApiClient.new(
        Rails.application.config.plaid
      )

      # Force sandbox environment for PlaidSandbox regardless of Rails config
      api_client.config.server_index = Plaid::Configuration::Environment["sandbox"]

      Plaid::PlaidApi.new(api_client)
    end
end
