class Patrimonio::DevolucaoDeBemPatrimonial < ApplicationRecord
  has_paper_trail

  include IncrementadorDeCodigoConcern
  include TradutorConcern
	include AASM

	attr_default :status, 1

  belongs_to :origem, polymorphic: true
  belongs_to :orcamento, class_name: "Orcamento"

  has_many :itens_da_devolucao_de_bens_patrimoniais, class_name: 'Patrimonio::ItemDaDevolucaoDeBemPatrimonial', dependent: :destroy
  accepts_nested_attributes_for :itens_da_devolucao_de_bens_patrimoniais, reject_if: :all_blank, allow_destroy: true

  validates_presence_of :data_da_devolucao, :numero_da_devolucao, :tipo, :responsavel, :observacao, :orcamento_id
	validates :itens_da_devolucao_de_bens_patrimoniais, uniq_nested_attributes: { atributo: :bem_patrimonial_id, mensagem: "Bem Patrimonial deve ser único." }

  before_validation :atribui_codigo_disponivel
  
	before_destroy :altera_status_da_cessao_para
  
  enum tipo: {
		parcial: 1,
		total: 2
	}

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

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

		event :confirmar_devolucao do
			transitions from: :solicitado, to: :confirmado do
				guard do
					self.solicitado? && self.contem_itens?
				end
				after do
					self.itens_da_devolucao_de_bens_patrimoniais.each do |item_da_devolucao|
						item_da_devolucao.bem_patrimonial.devolver!
					end
					self.devolucao_para_origem
				end
			end
		end

		event :retornar_devolucao_para_solicitado do
			transitions from: :confirmado, to: :solicitado do
				guard do 
					self.confirmado? && self.contem_itens?
				end
				after do
					self.itens_da_devolucao_de_bens_patrimoniais.each do |item_da_devolucao|
						item_da_devolucao.bem_patrimonial.ceder!
					end
				end
			end
		end
	end

  def atribui_codigo_disponivel
		if self.data_da_devolucao.present? && self.numero_da_devolucao.blank?
			gerar_codigo(self.data_da_devolucao, :numero_da_devolucao, :data_da_devolucao, :orcamento_id, self.orcamento_id)
		end
	end

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

	def altera_status_da_cessao_para
		self.origem.voltar_para_confirmado!
	end

	def devolucao_para_origem
		self.origem.devolver_cessao!
	end

  def contem_itens?
    self.itens_da_devolucao_de_bens_patrimoniais.size > 0
  end

end
