class IpAddress < ApplicationRecord
  belongs_to :model, polymorphic: true
  belongs_to :user
  attribute :ip_addr, :ip_address

  def self.model_types
    %w[Post User Comment Dmail ArtistVersion ArtistCommentaryVersion NoteVersion WikiPageVersion]
  end

  def self.visible(user)
    user.is_admin? ? all : where.not(model_type: "Dmail")
  end

  def self.search(params)
    q = search_attributes(params, :ip_addr, :user, :model)
    q.order(created_at: :desc)
  end

  def self.group_by_ip_addr(ipv4_masklen = nil, ipv6_masklen = nil)
    ipv4_masklen ||= 32
    ipv6_masklen ||= 128

    q = select(sanitize_sql([<<~SQL, ipv4_masklen, ipv6_masklen]))
      CASE
        WHEN family(ip_addr) = 4
        THEN network(set_masklen(ip_addr, ?))
        ELSE network(set_masklen(ip_addr, ?))
      END AS ip_addr,
      COUNT(*) AS count_all
    SQL

    q.group("1").reorder("count_all DESC, ip_addr")
  end

  def self.group_by_user
    group(:user_id).select("user_id, COUNT(*) AS count_all").reorder("count_all DESC, user_id")
  end

  def lookup
    @lookup ||= ip_addr.ip_lookup
  end

  def to_s
    ip_addr.to_s
  end

  def readonly?
    true
  end

  def self.available_includes
    [:user, :model]
  end
end
