# == Schema Information
#
# Table name: assign_tos
#
#  id                                              :integer          not null, primary key
#  daily_email_notifications_enabled               :boolean          default(FALSE), not null
#  instant_email_dossier_notifications_enabled     :boolean          default(FALSE), not null
#  instant_email_message_notifications_enabled     :boolean          default(FALSE), not null
#  instant_expert_avis_email_notifications_enabled :boolean          default(FALSE)
#  manager                                         :boolean          default(FALSE)
#  weekly_email_notifications_enabled              :boolean          default(TRUE), not null
#  created_at                                      :datetime
#  updated_at                                      :datetime
#  groupe_instructeur_id                           :bigint
#  instructeur_id                                  :integer
#
class AssignTo < ApplicationRecord
  belongs_to :instructeur, optional: false
  belongs_to :groupe_instructeur, optional: false
  has_one :procedure_presentation, dependent: :destroy
  has_one :procedure, through: :groupe_instructeur

  scope :with_email_notifications, -> { where(daily_email_notifications_enabled: true) }

  def procedure_presentation_or_default_and_errors
    errors = reset_procedure_presentation_if_invalid
    if self.procedure_presentation.nil?
      self.procedure_presentation = build_procedure_presentation
      self.procedure_presentation.save if procedure_presentation.valid? && !procedure_presentation.persisted?
    end
    [self.procedure_presentation, errors]
  end

  private

  def reset_procedure_presentation_if_invalid
    if procedure_presentation&.invalid?
      # This is a last defense against invalid `ProcedurePresentation`s persistently
      # hindering instructeurs. Whenever this gets triggered, it means that there is
      # a bug somewhere else that we need to fix.

      errors = procedure_presentation.errors
      Sentry.capture_message(
        "Destroying invalid ProcedurePresentation",
        extra: { procedure_presentation: procedure_presentation.as_json }
      )
      self.procedure_presentation = nil
      errors
    end
  end
end