class ZuoraConnect::AppInstanceBase

def set_timezone(timezone: self.timezone, type: :default)

def set_timezone(timezone: self.timezone, type: :default)
  if timezone.blank?
    timezone = self.timezone
  end
  if type == :default
    Time.zone = timezone
  elsif type == :user
    begin
      sql = <<-eos
        SELECT zuora_users.zuora_identity_response FROM "#{self.id}".zuora_users ORDER BY zuora_users.updated_at DESC LIMIT 1;
      eos
      user = ActiveRecord::Base.connection.execute(sql).to_a.first
      if user.present?
        zuora_identity_response = JSON.parse(user.fetch('zuora_identity_response', '{}'))
        self.user_timezone = zuora_identity_response.values.first&.dig('timeZone')
      else
        if (Redis.current.hget(TIMEZONE_LOG_RATE_LIMIT_KEY, self.id).to_i + TIMEZONE_LOG_PERIOD.to_i) <= Time.now.to_i
          Rails.logger.error('Cannot find any user to set the timezone', app_instance_id: self.id)
          Redis.current.hset(TIMEZONE_LOG_RATE_LIMIT_KEY, self.id, Time.now.to_i)
        end
      end
    rescue => ex
      Rails.logger.error('There is an error while getting timezone users', ex)
    end
    if self.user_timezone.present?
      # connect instance which has a custom timezone
      if !self.auto_deployed? && (
        ActiveSupport::TimeZone[self.task_data.dig('user_settings', 'timezone') || '']&.utc_offset !=
          ActiveSupport::TimeZone[self.user_timezone]&.utc_offset
      )
        if self.environment == 'Production' &&
          (Redis.current.hget(TIMEZONE_LOG_RATE_LIMIT_KEY, self.id).to_i + TIMEZONE_LOG_PERIOD.to_i) <= Time.now.to_i
          ZuoraConnect.logger.error(
            "Instance and user timezones are different. User has '#{self.user_timezone}' and " \
            "instance has '#{self.task_data.dig('user_settings', 'timezone')}'",
            app_instance_id: self.id
          )
          Redis.current.hset(TIMEZONE_LOG_RATE_LIMIT_KEY, self.id, Time.now.to_i)
        end
        self.user_timezone = nil
        Time.zone = timezone
      else
        begin
          Time.zone = self.user_timezone
        rescue ArgumentError
          Rails.logger.error('Malformed user timezone', app_instance_id: self.id)
          Time.zone = timezone
        end
      end
    else
      Time.zone = timezone
    end
  end
rescue => e
  Rails.logger.error('Malformed timezone used', e, app_instance_id: self.id)
  Time.zone = self.timezone
end