module ZuoraConnect::Controllers::Helpers

def create_new_instance

def create_new_instance
  ZuoraConnect::AppInstance.read_master_db do
    Thread.current[:appinstance] = nil
    ZuoraConnect.logger.with_fields = {} if ZuoraConnect.logger.is_a?(Ougai::Logger)
    Rails.logger.with_fields = {} if Rails.logger.is_a?(Ougai::Logger)
    if defined?(ElasticAPM) && ElasticAPM.running? && ElasticAPM.respond_to?(:set_label)
      ElasticAPM.set_label(:trace_id, request.uuid)
    end
    zuora_host = request.headers['zuora-host']
    zuora_entity_id = (request.headers['zuora-entity-ids'] || '').gsub(
      '-',
      ''
    ).split(',').first
    # Validate host present
    if zuora_host.blank?
      render json: {
        status: 401,
        message: 'zuora-host header was not supplied.'
      }, status: :unauthorized
      return
    end
    # Validate entity-ids present
    if zuora_entity_id.blank?
      render json: {
        status: 401,
        message: 'zuora-entity-ids header was not supplied.'
      }, status: :unauthorized
      return
    end
    rest_domain = ZuoraAPI::Login.new(url: "https://#{zuora_host}").rest_domain
    app_instance_id = ZuoraConnect::AppInstance.where(
      'zuora_entity_ids ?& array[:entities] AND zuora_domain = :host',
      entities: [zuora_entity_id],
      host: rest_domain
    ).pluck(:id).first
    if app_instance_id.present?
      render json: {
        status: 409,
        message: 'Instance already exists.',
        app_instance_id: app_instance_id
      }, status: 409
    else
      Apartment::Tenant.switch!("public")
      retry_count = 3
      begin
        @appinstance = new_instance(
          next_instance_id,
          zuora_entity_id,
          rest_domain,
          tenant_id: request.headers['zuora-tenant-id'],
          retry_count: retry_count
        )
      rescue ActiveRecord::RecordNotUnique
        retry if (retry_count -= 1).positive?
        return
      end
      app_instance_id = @appinstance.id
    end
    begin
      Apartment::Tenant.switch!('public')
      Apartment::Tenant.create(app_instance_id.to_s)
    rescue Apartment::TenantExists
      ZuoraConnect.logger.debug('Tenant Already Exists')
    end
  end
end