class Patrimonio::CessaoDeBemPatrimonial < ApplicationRecord
  has_paper_trail

	include TradutorConcern
	include AASM

	attr_default :status, 1

	belongs_to :beneficente, class_name: 'Base::Pessoa'

	has_many :unidades_gestoras_da_cessao , class_name: 'Patrimonio::UnidadeGestoraDaCessao', dependent: :destroy
	has_many :unidades_gestoras, through: :unidades_gestoras_da_cessao
	has_many :bens_patrimoniais_cedidos, class_name: 'Patrimonio::BemPatrimonialCedido', dependent: :destroy
	has_many :bens_patrimoniais, through: :bens_patrimoniais_cedidos

	accepts_nested_attributes_for :unidades_gestoras_da_cessao, reject_if: :all_blank, allow_destroy: true
	accepts_nested_attributes_for :bens_patrimoniais_cedidos, reject_if: :all_blank, allow_destroy: true

	validate :valida_obrigatoriedade_unidades_gestoras
	validates :unidades_gestoras_da_cessao, uniq_nested_attributes: { atributo: :unidade_gestora_id, mensagem: "Unidade Gestora deve ser único." }

  validates_presence_of :data_da_cessao, :numero_do_termo, :beneficente_id, :responsavel

  enum status: {
		solicitado: 1,
		confirmado: 2,
		devolvido: 3
	}

	aasm column: :status, enum: true, whiny_transitions: false do
		state :solicitado, :initial => true
		state :confirmado
		state :devolvido

		event :confirmar_cessao do
			transitions from: :solicitado, to: :confirmado do
				guard do
					self.solicitado? && self.contem_itens?
				end
				after do
					self.bens_patrimoniais_cedidos.each do |bem_patrimonial_cedido|
						bem_patrimonial_cedido.bem_patrimonial.ceder!
					end
				end
			end
		end

		event :retornar_para_solicitado do
			transitions from: :confirmado, to: :solicitado do
				guard do 
					self.confirmado? && self.contem_itens? && self.todos_os_bens_ainda_estao_cedidos?
				end
				after do
					self.bens_patrimoniais_cedidos.each do |bem_patrimonial_cedido|
						bem_patrimonial_cedido.bem_patrimonial.devolver!
					end
				end
			end
		end

		event :devolver_cessao do
			transitions to: :devolvido
		end

		event :voltar_para_confirmado do
			transitions to: :confirmado
		end
	end

	def tipo_de_label_status
    if self.confirmado?
      'success'
    elsif self.solicitado?
      'info'
    else
      'default'
    end
  end

	def contem_itens?
    self.bens_patrimoniais_cedidos.size > 0
  end

	def contem_bens_para_devolver?
    self.bens_patrimoniais.where(status_complementar: 1).size > 0
  end

	def todos_os_bens_ainda_estao_cedidos?
    self.bens_patrimoniais.where(status_complementar: 1).size == self.bens_patrimoniais_cedidos.size
  end

	def valida_obrigatoriedade_unidades_gestoras
		errors.add(:unidades_gestoras_da_cessao, "É obrigatório informar pelo menos uma Unidade.") if self.unidades_gestoras_da_cessao.empty?
	end
  
end
