class Loa::MetaFisica < ApplicationRecord
	has_paper_trail

	belongs_to :unidade_de_medida, required: true
	belongs_to :subacao, class_name:'Loa::Subacao', required: true

	has_many :metas_fisicas_da_liquidacao, dependent: :restrict_with_exception, class_name: 'Contabilidade::MetaFisicaDaLiquidacao'

	validates_presence_of :unidade_de_medida_id, :quantidade, :produto, :status_do_orcamento

	validates_uniqueness_of :produto, case_sensitive: false, scope: :subacao_id, message: "Meta já cadastrada nesta ação"


	validates_length_of :produto, maximum: 120

	validates_numericality_of :quantidade, greater_than: 0

	validate :verifica_casas_decimais

	validate :case_sensitive_caracteres_acentuados, on: :create

	enum status_do_orcamento: STATUS_DO_ORCAMENTO

	def importar_dados_da_meta orcamento_atual
		ppa_meta = Ppa::Meta.find(self.ppa_meta_id)
		if ppa_meta
			quantitativo = ppa_meta.quantitativos.where(exercicio: orcamento_atual.exercicio).first
			self.produto = ppa_meta.descricao[0..119]
			self.quantidade = quantitativo.indice_de_referencia
			self.unidade_de_medida_id = quantitativo.unidade_de_medida_id
		end
	end

	def importado_do_ppa?
		self.ppa_meta_id.present? ? true : false
	end

	def produto_da_meta_fisica
		"#{produto.to_s.truncate(30)}"
	end

	def realizada?
		total_da_meta_fisica = metas_fisicas_da_liquidacao.inject(0) { |total, meta_fisica|
			total + meta_fisica.quantidade.to_f
		}

		total_da_meta_fisica.eql?(quantidade.to_f)
	end

	def total_realizado_da_meta_fisica
		total_realizado = metas_fisicas_da_liquidacao.inject(0) { |total, meta_fisica|
			total + meta_fisica.quantidade.to_f
		}

		return total_realizado.to_f
	end

	def quantidade_atual_da_meta_fisica
		return ( quantidade.to_f - total_realizado_da_meta_fisica ).to_f
	end

	def percentual?
		unidade_de_medida.present? && unidade_de_medida.descricao.to_s == "%" ? true : false
	end

	def quantidade
		if (unidade_de_medida.present? && unidade_de_medida.utiliza_casa_decimal) || percentual?
			self[:quantidade].to_f
		else
			self[:quantidade].to_i
		end
	end

	def quantidade_realizada
		total_realizado_da_meta_fisica.to_i
		if (unidade_de_medida.present? && unidade_de_medida.utiliza_casa_decimal) || percentual?
			total_realizado_da_meta_fisica.to_f
		end
	end

	def quantidade_formatada
		Integer === self.quantidade  ? self.quantidade : self.quantidade.try(:contabil)
	end

	private
	def case_sensitive_caracteres_acentuados
		meta_fisica_cadastrada = ::Loa::MetaFisica.where( "subacao_id = ? and unidade_de_medida_id = ? and unaccent(produto) ilike unaccent(?)", self.try(:subacao_id), self.try(:unidade_de_medida_id), produto ).first
		
		if meta_fisica_cadastrada.present? &&
				meta_fisica_cadastrada.produto.parameterize.eql?(produto.parameterize)

			errors.add(:produto, 'já existe')
		end
	end

	def verifica_casas_decimais
		unless (unidade_de_medida.present? && unidade_de_medida.utiliza_casa_decimal) || percentual?
			errors.add(:quantidade, "Para essa unidade de medida a quantidade deve ser inteira.") if self[:quantidade].to_f - self[:quantidade].to_i > 0
		end
	end
end
