class Sparkpost::DomainService < ApplicationService
  def initialize(action, setting)
    api_key = Rails.application.secrets.sparkpost[:api_key]

    @header = {
      Accept: :json,
      'Context-Type' => :json,
      Authorization: api_key
    }
    @action = action
    @setting = setting
    @url = "https://api.sparkpost.com/api/v1/#{end_point}"
  end

  def call
    return unless @setting.domain

    response = case @action
    when :create
      RestClient.post(@url, set_options, @header)
    when :show
      @url += "/#{@setting.domain}"
      RestClient.get(@url, @header)
    when :verify
      options = { dkim_verify: true }
      @url += "/#{@setting.domain}/verify"
      RestClient.post(@url, options.to_json, @header)
    when :cname_verify
      options = { cname_verify: true }
      @url += "/#{@setting.domain}/verify"
      RestClient.post(@url, options.to_json, @header)
    when :link
      options = { tracking_domain: tracking.domain }
      @url += "/#{@setting.domain}"
      RestClient.put(@url, options.to_json, @header)
    when :delete
      @url += "/#{@setting.domain}"
      RestClient.delete(@url, @header)
    end
    return response if @action == :delete

    JSON.parse(response.body)
  rescue RestClient::Exception => e
    JSON.parse(e.response.body)
  end

  def set_options
    {}.tap do |props|
      props[:domain] = @setting.domain

      if @setting.tracking?
        props[:secure] = true
      else
        props[:generate_dkim] = true
      end
    end.to_json
  end

  def end_point
    @setting.tracking? ? 'tracking-domains' : 'sending-domains'
  end

  def tracking
    @setting.school.communication_sparkpost_configs.tracking
  end
end
