# frozen_string_literal: true

module Admin::ActionLogsHelper
  def log_target(log)
    case log.target_type
    when 'Account'
      link_to (log.human_identifier.presence || I18n.t('admin.action_logs.deleted_account')), admin_account_path(log.target_id)
    when 'User'
      if log.route_param.present?
        link_to log.human_identifier, admin_account_path(log.route_param)
      else
        I18n.t('admin.action_logs.deleted_account')
      end
    when 'UserRole'
      link_to log.human_identifier, admin_roles_path(log.target_id)
    when 'UsernameBlock'
      link_to log.human_identifier, edit_admin_username_block_path(log.target_id)
    when 'Report'
      link_to "##{log.human_identifier.presence || log.target_id}", admin_report_path(log.target_id)
    when 'Instance', 'DomainBlock', 'DomainAllow', 'UnavailableDomain'
      log.human_identifier.present? ? link_to(log.human_identifier, admin_instance_path(log.human_identifier)) : I18n.t('admin.action_logs.unavailable_instance')
    when 'Status', 'Collection'
      link_to log.human_identifier, log.permalink
    when 'AccountWarning'
      link_to log.human_identifier, disputes_strike_path(log.target_id)
    when 'Announcement'
      link_to truncate(log.human_identifier), edit_admin_announcement_path(log.target_id)
    when 'IpBlock', 'EmailDomainBlock', 'CustomEmoji'
      log.human_identifier
    when 'CanonicalEmailBlock'
      content_tag(:samp, (log.human_identifier.presence || '')[0...7], title: log.human_identifier)
    when 'Appeal'
      if log.route_param.present?
        link_to log.human_identifier, disputes_strike_path(log.route_param.presence)
      else
        I18n.t('admin.action_logs.deleted_account')
      end
    when 'Relay'
      link_to log.human_identifier, admin_relays_path
    when 'Tag'
      link_to log.human_identifier, admin_tag_path(log.target_id)
    end
  end

  def chain_multiple_translations(action_log)
    case action_log.target_type
    when 'Tag'
      %i(usable trendable listable).filter_map do |key|
        fetch_key = permutation_of_key(action_log, key)
        next if fetch_key.nil?

        t "admin.trends.tags.#{fetch_key}"
      end.join('; ')
    end
  end

  def permutation_of_key(log, key)
    # we're utilizing the store_accessors here, to get the values from the jsonb like: log.listable => true
    return if log.public_send(key).nil?

    log.public_send(key) ? key : :"not_#{key}"
  end

  def sorted_action_log_types
    Admin::ActionLogFilter::ACTION_TYPE_MAP
      .keys
      .map { |key| [I18n.t("admin.action_logs.action_types.#{key}"), key] }
      .sort_by(&:first)
  end
end
