class Kameleoon::Configuration::DataFile

def any_targeted_delivery_rule?

def any_targeted_delivery_rule?
  @feature_flags.any? { |_, ff| ff.environment_enabled && ff.rules.any?(&:targeted_delivery_type?) }
end

def collect_indices

def collect_indices
  @feature_flag_by_id = {}
  @rule_by_segment_id = {}
  @variation_by_id = {}
  @experiment_ids_with_js_css_variable = Set.new
  @feature_flags.each_value do |feature_flag|
    @feature_flag_by_id[feature_flag.id] = feature_flag
    next if feature_flag.rules.nil?
    has_feature_flag_variable_js_css = feature_flag_variable_js_css?(feature_flag)
    feature_flag.rules.each do |rule|
      @rule_by_segment_id[rule.segment_id] = rule
      rule.variation_by_exposition.each do |variation|
        @variation_by_id[variation.variation_id] = variation
      end
      @experiment_ids_with_js_css_variable.add(rule.experiment_id) if has_feature_flag_variable_js_css
    end
  end
  @feature_flag_by_id.freeze
  @rule_by_segment_id.freeze
  @variation_by_id.freeze
  @experiment_ids_with_js_css_variable.freeze
end

def experiment_js_css_variable?(experiment_id)

def experiment_js_css_variable?(experiment_id)
  @experiment_ids_with_js_css_variable.include?(experiment_id)
end

def feature_flag_variable_js_css?(feature_flag)

def feature_flag_variable_js_css?(feature_flag)
  feature_flag.variations.first&.variables&.any? do |variable|
    %w[JS CSS].include?(variable.type)
  end
end

def get_feature_flag(feature_key)

def get_feature_flag(feature_key)
  ff = @feature_flags[feature_key]
  raise Exception::FeatureNotFound, feature_key if ff.nil?
  raise Exception::FeatureEnvironmentDisabled.new(feature_key, @environment) unless ff.environment_enabled
  ff
end

def init(configuration)

def init(configuration)
  Logging::KameleoonLogger.debug('CALL: DataFile.init(configuration: %s)', configuration)
  @settings = Settings.new(configuration['configuration'])
  @feature_flags = {}
  configuration['featureFlags'].each do |raw|
    ff = FeatureFlag.new(raw)
    @feature_flags[ff.feature_key] = ff
  end
  @has_any_targeted_delivery_rule = any_targeted_delivery_rule?
  @custom_data_info = CustomDataInfo.new(configuration['customData'])
  Logging::KameleoonLogger.debug('RETURN: DataFile.init(configuration: %s)', configuration)
end

def init_default

def init_default
  Logging::KameleoonLogger.debug('CALL: DataFile.init_default')
  @settings = Settings.new
  @feature_flags = {}
  @has_any_targeted_delivery_rule = false
  @custom_data_info = Kameleoon::Configuration::CustomDataInfo.new(nil)
  Logging::KameleoonLogger.debug('RETURN: DataFile.init_default')
end

def initialize(environment, configuration = nil)

def initialize(environment, configuration = nil)
  Logging::KameleoonLogger.debug('CALL: DataFile.new(environment: %s)', environment)
  @environment = environment
  if configuration.nil?
    init_default
  else
    init(configuration)
  end
  collect_indices
  Logging::KameleoonLogger.debug('RETURN: DataFile.new(environment: %s)', environment)
end

def to_s

def to_s
  'DataFile{' \
    "environment:#{@environment}," \
    "feature_flags:#{@feature_flags.size}," \
    "settings:#{@settings}" \
    '}'
end