class Obra::PreConvenio < ApplicationRecord
	include TradutorConcern
	has_paper_trail

	attr_accessor :orgao_id

	belongs_to :unidade_orcamentaria, class_name: 'Loa::UnidadeOrcamentaria', required: true
	belongs_to :orgao_cedente, class_name: 'Base::Pessoa', foreign_key: "orgao_cedente_id", required: true
	belongs_to :funcao, class_name: 'Base::Funcao', required: true

	has_one :transferencia, class_name: "Obra::Transferencia"

	has_many :fontes_de_recursos_do_pre_convenio, class_name: 'Obra::FonteDeRecursoDoPreConvenio', dependent: :destroy
	has_many :fontes_de_recursos, through: :fontes_de_recursos_do_pre_convenio, source: :fonte_de_recurso, class_name: 'Base::FonteDeRecursos'

	accepts_nested_attributes_for :fontes_de_recursos_do_pre_convenio, reject_if: :all_blank, allow_destroy: true

	validates_associated :fontes_de_recursos_do_pre_convenio

	validates_presence_of :data_do_cadastro, :modalidade

	validates :fontes_de_recursos_do_pre_convenio, uniq_nested_attributes: { atributo: :fonte_de_recurso_id, mensagem: "fonte de recurso deve ser única dentro de um pré convênio" }
	validate :valida_valor_total
	validate :valor_total_das_fontes_de_recursos_do_pre_convenio_deve_ser_igual_ao_valor_total_do_pre_convenio, if: Proc.new { fontes_de_recursos_do_pre_convenio.any? }

	enum modalidade: {
		convenio_sus: 0,
		convenio_exceto_sus: 1,
		contrato_de_repasse: 2
	}

	def gerar_convenio
		convenio = Obra::Transferencia.new(pre_convenio_id: self.id, data: Date.today, tipo: "convenio", unidade_orcamentaria: unidade_orcamentaria,
			orgao_cedente: orgao_cedente, funcao: funcao, modalidade: self.modalidade, valor_repasse: self.valor_repasse,
			valor_contrapartida: self.valor_contrapartida, valor_total: self.valor_total)
		convenio.save(validate: false)
	end

	def valor_total_das_fontes_de_recursos_do_pre_convenio_deve_ser_igual_ao_valor_total_do_pre_convenio
		if valor_total_das_fontes_de_recursos_do_pre_convenio != self.valor_total.to_f
			errors.add(:total_erro, "O valor total das fontes de recursos #{valor_total_das_fontes_de_recursos_do_pre_convenio.try(:real_contabil)} deve ser igual ao valor total do pré convênio #{self.valor_total.try(:real_contabil)}")
		end
	end

	private

	def valida_valor_total
		if self.valor_total && self.valor_repasse && self.valor_contrapartida
			errors.add(:valor_total, "valor total deve ser igual a soma dos valores de repasse e contrapartida") unless self.valor_total == (self.valor_repasse + self.valor_contrapartida)
		end
	end

	def valor_total_das_fontes_de_recursos_do_pre_convenio
		total = self.fontes_de_recursos_do_pre_convenio.inject(0) { |total, fonte_de_recurso_do_pre_convenio|
			total + fonte_de_recurso_do_pre_convenio.valor.to_f
		}
	end

end
