class Ppa::Eixo < ApplicationRecord

	has_paper_trail

	belongs_to :ppa
	has_many :programas, dependent: :restrict_with_exception

	validates_uniqueness_of :nome, scope: :ppa_id
	validates_presence_of :nome, :ppa_id
	validates :ppa_id, immutable: true

	before_destroy :bloqueia_exclusao_caso_tenha_um_eixo

	def self.recursos_eixo_por_ppa(ppa_id)
		where(ppa_id: ppa_id).map { |eixo|
			{
				nome: eixo.nome,
				quantidade: eixo.valor_das_despesas,
				qtd_programas: eixo.programas.count
			}
		}.sort_by { |e| (e[:quantidade]) }.reverse
	end

	def diretrizes_concatenadas
		diretrizes.join("\n\n")
	end

	def quantidade_de_programas
		programas.count
	end

	def valor_das_despesas
		sql = self.ppa.detalha_despesas_nas_iniciativas? ? sql_despesa_por_iniciativa : sql_despesa_por_programa
		ActiveRecord::Base.connection.execute( sql ).to_a.first['valor'].to_f
	end

	private
	def sql_despesa_por_programa
		%Q(
		SELECT sum(projecao.valor) as valor
		  FROM ppa_eixos eixo
		  JOIN ppa_programas programa ON programa.eixo_id = eixo.id
		  JOIN ppa_projecoes_de_despesa projecao ON projecao.orcador_id = programa.id
		 WHERE eixo.ppa_id = #{ppa_id}
		   AND orcador_type = 'Ppa::Programa'
		   AND eixo.id = #{id}
		)
	end

	def sql_despesa_por_iniciativa
		%Q(
		SELECT sum (projecao.valor) as valor
	      FROM ppa_eixos eixo
	      JOIN ppa_programas programa ON programa.eixo_id = eixo.id
	      JOIN ppa_objetivos objetivo ON objetivo.programa_id = programa.id
	      JOIN ppa_iniciativas iniciativa ON iniciativa.objetivo_id = objetivo.id
	      JOIN ppa_projecoes_de_despesa projecao ON projecao.orcador_id = iniciativa.id
	     WHERE eixo.ppa_id = #{ppa_id}
	       AND orcador_type = 'Ppa::iniciativa'
		   AND eixo.id = #{id}
		)
	end

	def bloqueia_exclusao_caso_tenha_um_eixo
		if self.ppa.eixos.count == 1
			raise Exception.new('Não é possível excluir, pois é o único eixo do sistema')
		end
	end
end
