class Stripe::ApplicationService < ApplicationService
  def initialize(model, action, id = nil, options = {})
    @model = model
    @action = action.to_sym
    @id = id
    @options = options
  end

  private
    def base_url
      Rails.application.secrets.stripe[:base_url]
    end

    def url
      "#{base_url}/#{endpoint}"
    end

    def headers
      {
        'Authorization' => "Bearer #{Rails.application.secrets.stripe[:api_key]}",
        'Content-Type' => 'application/x-www-form-urlencoded'
      }
    end

    def rest_client_request(method, path, model, area, body: {}, additional_headers: {})
      response = RestClient::Request.execute(
        method: method,
        url: path,
        headers: headers.merge(additional_headers),
        payload: body
      )
      status_code = response.code
      response_body = JSON.parse(response.body)
      response
    rescue RestClient::Exception => e
      status_code = e.http_code
      response_body = e.response&.body
      nil
    ensure
      model.connection_logs.create!(
        school: @model.school,
        service: :stripe,
        area: area,
        http_method: method,
        status_code: status_code,
        endpoint: endpoint,
        response: response_body&.slice(0, 1000),
        payload: body
      )
    end
end
