require 'active_support/concern'
require 'aasm'

module VistoriavelAnulacoesDoEmpenhoConcern
	extend ActiveSupport::Concern

	included do
		include AASM

		has_many :vistos, as: :vistoriavel, class_name: "Controladoria::Visto"

		aasm column: :status, enum: true, whiny_transitions: false do
			state :solicitado, initial: true
			state :enviado_para_controladoria
			state :enviado_para_contabilidade
			state :enviado_para_administrativo
			state :confirmado
			state :recebido

			event :enviar_para_controladoria, guard: :envia_pra_controladoria? do
				transitions from: :solicitado, to: :enviado_para_controladoria do
					guard do 
						self.valor.to_d > 0
					end
				end
			end

			event :retornar_para_administrativo do
				transitions from: :enviado_para_controladoria, to: :solicitado, guard: :reprovado_pela_controladoria?
				transitions from: :enviado_para_contabilidade, to: :solicitado
			end

			event :enviar_para_contabilidade, guard: :envia_pra_contabilidade? do
				transitions from: :solicitado, to: :enviado_para_contabilidade do
					guard do
						!envia_pra_controladoria? && self.valor.to_d > 0
					end
				end

				transitions from: :enviado_para_controladoria, to: :enviado_para_contabilidade do
					guard do
						aprovado_pela_controladoria? && self.valor.to_d > 0
					end
				end
			end

			event :enviar_para_administrativo, guard: :aprovado_pela_controladoria? do
				transitions from: :enviado_para_controladoria, to: :enviado_para_administrativo do
					guard do
						!envia_pra_contabilidade? && self.valor.to_d > 0
					end
				end
			end

			event :receber do
				transitions from: :enviado_para_contabilidade, to: :recebido
			end

			event :confirmar do
				transitions from: :solicitado, to: :confirmado do
					guard do
						self.valor.to_d > 0
					end
				end

				transitions from: :enviado_para_administrativo, to: :confirmado
				transitions from: :recebido, to: :confirmado

				after do
					empenho.anular! if !empenho.anulado?
				end
			end

			event :retornar_para_solicitado do
				transitions from: :confirmado, to: :solicitado do 
					guard do
						!Configuracao.last.valida_saldo_da_dotacao_no_empenho? || (Configuracao.last.valida_saldo_da_dotacao_no_empenho? && self.empenho.orcamento_da_despesa.saldo.to_f - self.valor.to_f>=0)
					end

					after do
						self.apagar_movimento_orcamentario
					end
				end
			end
		end
	end

	# HELPER METHODS
	def envia_pra_controladoria?
		return Configuracao.last.envia_empenho_de_diaria_para_controladoria? if empenho_de_diaria?
		Configuracao.last.envia_empenho_para_controladoria?
	end

	def envia_pro_copfin?
		return Configuracao.last.envia_empenho_de_diaria_para_copfin? if empenho_de_diaria?
		Configuracao.last.envia_empenho_para_copfin?
	end

	def envia_pra_contabilidade?
		Configuracao.last.envia_empenho_para_contabilidade?
	end

	def aprovado_pela_controladoria?
		self.vistos.any? && self.vistos.last.aprovado? && updated_at < self.vistos.last.created_at
	end

	def reprovado_pela_controladoria?
		self.vistos.any? && !self.vistos.last.aprovado? && updated_at < self.vistos.last.created_at
	end

	def pode_criar_mais_vistos?
		enviado_para_controladoria? && (self.vistos.empty? || self.vistos.last.created_at < updated_at)
	end

	def empenho_de_diaria?
		empenho.diaria.present?
	end
end
