class Avo::Services::TelemetryService

def app_name

def app_name
  Rails.application.class.to_s.split("::").first
rescue
  nil
end

def avo_metadata

def avo_metadata
  resources = Avo.resource_manager.all
  dashboards = Avo::Current.app.dashboard_manager.all
  field_definitions = resources.map(&:get_field_definitions)
  fields_count = field_definitions.map(&:count).sum
  fields_per_resource = sprintf("%0.01f", fields_count / (resources.count + 0.0))
  field_types = {}
  custom_fields_count = 0
  field_definitions.each do |fields|
    fields.each do |field|
      field_types[field.type] ||= 0
      field_types[field.type] += 1
      custom_fields_count += 1 if field.custom?
    end
  end
  {
    resources_count: resources.count,
    dashboards_count: dashboards.count,
    fields_count: fields_count,
    fields_per_resource: fields_per_resource,
    custom_fields_count: custom_fields_count,
    field_types: field_types,
    **other_metadata(:actions),
    **other_metadata(:filters),
    main_menu_present: Avo.configuration.main_menu.present?,
    profile_menu_present: Avo.configuration.profile_menu.present?,
    cache_store: Avo.cache_store&.class&.to_s,
    **config_metadata
  }
# rescue => error
#   {
#     error: error.message
#   }
end

def config_metadata

def config_metadata
  {
    config: {
      root_path: Avo.configuration.root_path,
      app_name: Avo.configuration.app_name
    }
  }
end

def other_metadata(type = :actions)

def other_metadata(type = :actions)
  resources = Avo.resource_manager.all
  types = resources.map(&:"get_#{type}")
  type_count = types.flatten.uniq.count
  type_per_resource = sprintf("%0.01f", types.map(&:count).sum / (resources.count + 0.0))
  {
    "#{type}_count": type_count,
    "#{type}_per_resource": type_per_resource
  }
end

def telemetry_info

def telemetry_info
  {
    # license: Avo.configuration.license,
    # license_key: Avo.configuration.license_key,
    avo_version: Avo::VERSION,
    rails_version: Rails::VERSION::STRING,
    ruby_version: RUBY_VERSION,
    environment: Rails.env,
    # ip: current_request&.ip,
    # host: current_request&.host,
    # port: current_request&.port,
    app_name: app_name,
    avo_metadata: avo_metadata,
  }
end