require 'active_support/concern'
require 'aasm'

module VistoriavelPagamentosConcern
	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

			event :enviar_para_controladoria, guard: :envia_pra_controladoria? do
				transitions from: :solicitado, to: :enviado_para_controladoria do
					guard do 
						existe_lote_do_sim? == false
					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
						existe_lote_do_sim? == false && !envia_pra_controladoria?
					end
				end

				transitions from: :enviado_para_controladoria, to: :enviado_para_contabilidade do
					guard do
						existe_lote_do_sim? == false && aprovado_pela_controladoria?
					end
				end
			end

			event :enviar_para_administrativo, guard: :aprovado_pela_controladoria? do
				transitions from: :enviado_para_controladoria, to: :enviado_para_administrativo do
					guard do
						existe_lote_do_sim? == false && !envia_pra_contabilidade?
					end
				end
			end

			event :confirmar do
				after do
					update_column(:data, Date.today)
				end

				transitions from: :solicitado, to: :confirmado do
					guard do
						existe_lote_do_sim? == false && !envia_pra_controladoria? && !envia_pra_contabilidade?
					end
				end

				transitions from: :enviado_para_administrativo, to: :confirmado do 
					guard do
						existe_lote_do_sim? == false
					end
				end

				transitions from: :enviado_para_contabilidade, to: :confirmado do
					guard do 
						existe_lote_do_sim? == false
					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_pagamento_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_liquidacao_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
