class Player < ApplicationRecord
  # A Player can be an alt of another player (the main)
  belongs_to :main_player, class_name: "Player", optional: true, foreign_key: "main_player_id"

  # A Player can have multiple alts
  has_many :alternate_players, class_name: "Player", foreign_key: "main_player_id"

  # A Player can have many loots
  has_many :loots

  validate :no_circular_references

  def total_wins
    w = self.wins
    alternate_players.each { |alt|
      w += alt.wins
    }
    w
  end

  def total_losses
    l = self.losses
    alternate_players.each { |alt|
      l += alt.losses
    }
    l
  end

  def total_purse
    p = self.purse
    alternate_players.each { |alt|
      p += alt.purse
    }
    p
  end

  def alt?
    self.main_player
  end

  def has_alts?
    self.alternate_players.count > 0
  end

  def main_name
    if alt?
      self.main_player.name
    end
  end

  def no_circular_references
    if main_player_id.present? && (main_player.main_player== self)
      errors.add(:main_account, "circular reference")
    end
  end

  def get_loot
    loot = Loot.where(player_id: self.id)
    self.alternate_players.each do |alt|
      loot << Loot.where(player_id: alt.id)
    end
    loot
  end

  def get_loot_with_roll(roll)
    ids = [self.id] + self.alternate_players.pluck(:id)
    Loot.where(player_id: ids, roll_type: roll)
  end

  def get_loot_count
    get_loot.size
  end

  def get_loot_count_with_roll(roll)
    get_loot_with_roll(roll).size
  end
end