class Patrimonio::BaixaDoBem < ApplicationRecord
	has_paper_trail

	include AASM

	attr_default :status, :solicitado

	belongs_to :bem_patrimonial, class_name: 'Patrimonio::BemPatrimonial'
	belongs_to :comissao, class_name: 'Patrimonio::Comissao'
	belongs_to :baixa_do_bem_em_massa, class_name: 'Patrimonio::BaixaDoBemEmMassa'

	has_one :movimentacoes_financeiras_dos_bens, as: :origem, class_name: 'Patrimonio::MovimentacaoFinanceiraDoBem', dependent: :destroy

	validates_presence_of :bem_patrimonial_id, :comissao_id, :data_da_baixa, :motivo_da_baixa, :observacao
	# :valor_atual_do_bem

	# after_create :gerar_movimentacao_financeira_do_tombamento
	after_save :baixa_o_bem_patrimonial, if: Proc.new { self.confirmado? }
	after_create :definir_valor_atual_do_bem

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

	enum tipo: {
		individual: 1,
		em_massa: 2
	}

	enum motivo_da_baixa: {
		cessao: 1,
		destruicao: 2,
		doacao: 3,
		furto: 4,
		inservivel: 5,
		morte: 6,
		inclusao_indevida: 7,
		para_relancamento: 8,
		perda: 9,
		permuta: 10,
		renuncia_de_direito: 11,
		roubo: 12,
		sinistro: 13,
		transformacao: 14,
		venda: 15
	}

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

		event :confirmar_desreconhecimento do
			transitions from: :solicitado, to: :confirmado do
				guard do
					self.solicitado?
				end
				after do
					orcamento = self.bem_patrimonial.orcamento
					# self.gera_alteracao_do_valor_do_bem(orcamento)
					self.gerar_movimentacao_financeira_do_tombamento
					self.baixa_o_bem_patrimonial
					self.gera_conservacao_do_bem
				end
			end

		end

	end

	def definir_valor_atual_do_bem
		if self.bem_patrimonial.present?
			self.update_columns(
				valor_atual_do_bem: self.bem_patrimonial.valor_atualizado_do_bem
			)
		end
	end

	def gerar_movimentacao_financeira_do_tombamento
		movimentacao_financeira_do_tombamento = Patrimonio::MovimentacaoFinanceiraDoBem.create!(
			bem_patrimonial_id: self.bem_patrimonial.id,
			data_da_movimentacao: self.data_da_baixa,
			origem_id: self.id,
			origem_type: self.class.name,
			valor_inicial: self.valor_atual_do_bem,
			valor_da_operacao: (self.valor_atual_do_bem * - 1),
			valor_final: 0
		)
	end

	# Cria a alteração de valor que deixa o bem patrimonial zerado.
	def gera_alteracao_do_valor_do_bem(orcamento)
		alteracao_do_valor = Patrimonio::AlteracaoDoValorDoBem.create!(
			bem_patrimonial_id: self.bem_patrimonial.id,
			data_da_alteracao: self.data_da_baixa,
			status: 2,
			orcamento_id: orcamento.id,
			comissao_id: self.comissao.id,
			tipo_de_alteracao: 3,
			valor_base: self.valor_atual_do_bem,
			valor_alterado: (self.bem_patrimonial.valor_depreciado_do_bem * -1)
		)
	end

	def baixa_o_bem_patrimonial
		if self.status == 'confirmado'
			self.bem_patrimonial.update_columns(
				status: 6
			)
		end
	end

	def gera_conservacao_do_bem
		conservacao_do_bem = Patrimonio::ConservacaoDoBem.create!(
			bem_patrimonial_id: self.bem_patrimonial.id,
			data_da_conservacao: self.data_da_baixa,
			estado_do_bem: 8,
			status: 2
		)
	end

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