class Race < Base::Race
  has_many :race_students,
    inverse_of: :race,
    primary_key: :SRID,
    foreign_key: :RaceID,
    dependent: :restrict_with_error

  has_many :employees, inverse_of: :race, dependent: :nullify
  has_many :students, through: :race_students
  has_many :employees, dependent: :nullify

  associations_for namespace: 'Admission' do |a|
    a.has_many :applicant_races,
      primary_key: :SRID,
      dependent: :restrict_with_error

    a.has_many :applicants, through: :applicant_races, source: :applicant
  end

  STATES = [
    :indiana,
    :nebraska,
    :new_jersey,
    :california,
    :iowa,
    :michigan,
    :new_york,
    :pennslyvania,
    :colorado,
    :kansas,
    :illinois,
    :florida,
    :wisconsin,
    :new_mexico
  ]

  attr_writer :code_field

  scope :by_usa_or_default, ->(usa=false) { usa ? where.not(usa: 0) : where.not(default: '') }
  scope :id_greater_than_0, -> { where(id: 1..Float::INFINITY) }

  scope :with_code, ->(code) do
    return unless code

    collection = all
    collection.each { |member| member.code_field = code }
    collection
  end

  def code
    public_send(@code_field)
  end

  def self.for_state(state, code=false)
    return nil unless STATES.include?(state)

    query = order(state).where('SRID > 0').where.not(state => '')
    code ? query.with_code(state) : query
  end

  def self.for_usa(usa, code=false)
    id_greater_than_0
      .by_usa_or_default(usa.to_i == 1)
      .order(:name)
      .with_code(code)
  end
end
