# frozen_string_literal: true
# rubocop:todo all

class HmmCompany
  include Mongoid::Document

  field :p, type: Integer
  has_many :emails, primary_key: :p, foreign_key: :f, class_name: 'HmmEmail'

  # The addresses are added with different dependency mechanisms in tests:
  #has_many :addresses, class_name: 'HmmAddress', dependent: :destroy
end

class HmmEmail
  include Mongoid::Document

  field :f, type: Integer
  belongs_to :company, primary_key: :p, foreign_key: :f, class_name: 'HmmCompany'
end

class HmmAddress
  include Mongoid::Document

  belongs_to :company, class_name: 'HmmCompany'
end

class HmmOwner
  include Mongoid::Document

  has_many :pets, class_name: 'HmmPet', inverse_of: :current_owner

  field :name, type: String
end

class HmmPet
  include Mongoid::Document

  belongs_to :current_owner, class_name: 'HmmOwner', inverse_of: :pets, optional: true
  belongs_to :previous_owner, class_name: 'HmmOwner', inverse_of: nil, optional: true

  field :name, type: String
end

class HmmSchool
  include Mongoid::Document
  include Mongoid::Timestamps

  has_many :students, class_name: 'HmmStudent'

  field :district, type: String
  field :team, type: String
end

class HmmStudent
  include Mongoid::Document
  include Mongoid::Timestamps

  belongs_to :school, class_name: 'HmmSchool', touch: true

  field :name, type: String
  field :grade, type: Integer, default: 3
end

class HmmTicket
  include Mongoid::Document

  belongs_to :person
end

class HmmBus
  include Mongoid::Document

  has_many :seats, class_name: 'HmmBusSeat'
end

class HmmBusSeat
  include Mongoid::Document

  # No belongs_to :bus
end

class HmmTrainer
  include Mongoid::Document

  field :name, type: String

  has_many :animals, class_name: 'HmmAnimal', scope: :reptile
end

class HmmAnimal
  include Mongoid::Document

  field :taxonomy, type: String

  scope :reptile, -> { where(taxonomy: 'reptile') }

  belongs_to :trainer, class_name: 'HmmTrainer', scope: -> { where(name: 'Dave') }
end

class HmmPost
  include Mongoid::Document

  field :title, type: String

  has_many :comments, class_name: 'HmmComment', as: :container

  accepts_nested_attributes_for :comments, allow_destroy: true
end

class HmmComment
  include Mongoid::Document

  field :title, type: String
  field :num, type: Integer, default: 0

  belongs_to :container, polymorphic: true
  has_many :comments, class_name: 'HmmComment', as: :container

  accepts_nested_attributes_for :comments, allow_destroy: true

  validates :num, numericality: { greater_than_or_equal_to: 0 }
end
