class WikiRevision < ApplicationRecord
  belongs_to :wiki_page
  belongs_to :base_revision, class_name: 'WikiRevision', optional: true
  belongs_to :created_user, class_name: 'User'
  belongs_to :redirect_page, class_name: 'WikiPage', optional: true

  has_many :wiki_revision_lines, dependent: :delete_all
  has_many :wiki_lines, through: :wiki_revision_lines

  enum :kind, content: 0, redirect: 1

  validates :kind, presence: true
  validates :lines_count, numericality: { only_integer: true, greater_than_or_equal_to: 0 }
  validates :tree_sha256, length: { is: 64 }, allow_nil: true

  validate :kind_consistency

  def body
    return unless content?

    wiki_revision_lines
        .includes(:wiki_line)
        .order(:position)
        .map { |rev| rev.wiki_line.body }
        .join("\n")
  end

  private

  def kind_consistency
    if content?
      if tree_sha256.blank?
        errors.add(:tree_sha256, '種類がページの場合は必須です．') 
      end

      if redirect_page_id.present?
        errors.add(:redirect_page_id, '種類がページの場合は空である必要があります．')
      end
    end

    if redirect?
      if redirect_page_id.blank?
        errors.add(:redirect_page_id, '種類がリダイレクトの場合は必須です．')
      end

      if tree_sha256.present?
        errors.add(:tree_sha256, '種類がリダイレクトの場合は空である必要があります．')
      end

      if lines_count.to_i > 0
        errors.add(:lines_count, '種類がリダイレクトの場合は 0 である必要があります．')
      end
    end
  end
end
