module Loa
	class CotasOrcamentariasController < ApplicationController
		include ControllerConcern
		before_action :authenticate_usuario!
		before_action :autoriza_usuario!
		before_action :set_cota_orcamentaria, only: [:show, :edit, :update, :destroy]

		# GET /loa/cotas_orcamentarias
		def index
			@q = CotaOrcamentaria.where(orcamento: contexto_atual).order(:id).search(params[:q])
			@cotas_orcamentarias = @q.result(distinct: false)
		end

		def index_setorial
			if current_usuario.administrador? || current_usuario.desenvolvedor?
				@q = CotaOrcamentaria.where(orcamento: contexto_atual).order(:id).search(params[:q])
			else
				@q = CotaOrcamentaria.where(orcamento: contexto_atual, unidade_orcamentaria_id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id)).order(:id).search(params[:q])
			end
			@cotas_orcamentarias = @q.result(distinct: false)
		end

		# GET /loa/cotas_orcamentarias/1
		def show
		end

		# GET /loa/cotas_orcamentarias/new
		def new
			@cota_orcamentaria = CotaOrcamentaria.new
		end

		# GET /loa/cotas_orcamentarias/1/edit
		def edit
		end

		# POST /loa/cotas_orcamentarias
		def create
			@cota_orcamentaria = CotaOrcamentaria.new(cota_orcamentaria_params)

			if @cota_orcamentaria.save
				redirect_to @cota_orcamentaria, notice: 'Cota orcamentaria foi criado(a) com sucesso.'
			else
				render :new
			end
		end

		# PATCH/PUT /loa/cotas_orcamentarias/1
		def update
			if @cota_orcamentaria.update( cota_orcamentaria_params )
				redirect_to loa_cotas_orcamentarias_path, notice: 'Cota orcamentaria foi atualizado(a) com sucesso.'
			else
				render :edit
			end
		end

		# DELETE /loa/cotas_orcamentarias/1
		def destroy
			mensagem = apaga_e_retorna_mensagem(@cota_orcamentaria)
			redirect_to loa_cotas_orcamentarias_url, mensagem
		end

		def gerar
			begin
				# apaga cotas existentes
				CotaOrcamentaria.where(orcamento_id: contexto_atual).destroy_all

				# cria cotas
				# orcamento_atual - 2 anos
				unidades_do_orcamento_anterior = contexto_atual.orcamento_anterior.orcamento_anterior.unidades_orcamentarias.index_by(&:codigo_completo)
				fontes_do_orcamento_anterior = contexto_atual.orcamento_anterior.orcamento_anterior.fontes_de_recursos.index_by(&:codigo_completo)
				fontes_do_orcamento_atual = contexto_atual.fontes_de_recursos.index_by(&:codigo_completo)

				contexto_atual.unidades_orcamentarias.each do |uo|
					unidade_do_orcamento_anterior = unidades_do_orcamento_anterior[ uo.codigo_completo ]

					if unidade_do_orcamento_anterior.present?
						cota_orcamentaria = CotaOrcamentaria.new(
							orcamento_id: contexto_atual.id,
							unidade_orcamentaria_id: uo.id,
							unidade_orcamentaria_exercicio_anterior_id: unidade_do_orcamento_anterior.id
						)

						if cota_orcamentaria.save!
							fontes_de_recursos_da_unidade_do_orcamento_anterior = Contabilidade::Empenho.where(unidade_orcamentaria_id: unidade_do_orcamento_anterior.id, orcamento_id: contexto_atual.orcamento_anterior.orcamento_anterior.id).confirmados.ativos.do_orcamento.map(&:fonte_de_recursos).uniq

							fontes_de_recursos_da_unidade_do_orcamento_anterior.each do |fonte|
								fonte_do_orcamento_atual = fontes_do_orcamento_atual[ fonte.codigo_completo ]

								fonte_da_cota_orcamentaria = cota_orcamentaria.fontes_das_cotas_orcamentarias.new(
									fonte_de_recursos_id: fonte_do_orcamento_atual.id,
									fonte_de_recursos_do_ano_anterior_id: fonte.id
								)

								fonte_da_cota_orcamentaria.save(validate: false)
							end

						end
					else
						cota_orcamentaria = CotaOrcamentaria.create(
							orcamento_id: contexto_atual.id,
							unidade_orcamentaria_id: uo.id
						)
					end
				end

				contexto_atual.cotas_orcamentarias.each do |cota_orcamentaria|
					cota_orcamentaria.calcular_percentual_empenhado
				end

				contexto_atual.cotas_orcamentarias.each do |cota_orcamentaria|
					cota_orcamentaria.calcular_percentual_proposto
				end

				redirect_to loa_cotas_orcamentarias_url, notice: "Cotas geradas com sucesso."
			rescue Exception => e
				raise ActiveRecord::Rollback
				redirect_to loa_cotas_orcamentarias_url, notice: "Não foi possível gerar as cotas."
			end
		end

		def imprimir_por_unidade

			@cotas_orcamentarias = CotaOrcamentaria.where(orcamento: contexto_atual).sort_by { |i| i.unidade_orcamentaria.codigo_completo }

			@configuracoes = Configuracao.last
			respond_to do |format|
				format.pdf do
					render pdf: "cotas_orcamentarias_por_unidade",
					template: 'loa/cotas_orcamentarias/por_unidade.pdf.slim',
					orientation: 'Landscape',
					header: {
						html: {
							template: 'layouts/_cabecalho_pdf.html.slim',
							locals: { titulo1: "Cotas Orçamentárias #{contexto_atual.exercicio}" , titulo2: "POR UNIDADES", titulo3: "" }
						},
						spacing: 0
					},
					footer: { right: '', font_size: 8 },
					disable_smart_shrinking: true,
					dpi: '96',
					margin: @configuracoes.margens_customizadas(top: 4)
				end
			end
		end

		def imprimir_por_fonte
			@fontes_das_cotas_orcamentarias = FonteDaCotaOrcamentaria.joins(:cota_orcamentaria).where(loa_cotas_orcamentarias: {orcamento_id: contexto_atual.id})

			@configuracoes = Configuracao.last
			respond_to do |format|
				format.pdf do
					render pdf: "cotas_orcamentarias_por_fonte",
					template: 'loa/cotas_orcamentarias/por_fonte.pdf.slim',
					orientation: 'Landscape',
					header: {
						html: {
							template: 'layouts/_cabecalho_pdf.html.slim',
							locals: { titulo1: "Cotas Orçamentárias #{contexto_atual.exercicio}" , titulo2: "POR FONTES", titulo3: "" }
						},
						spacing: 0
					},
					footer: { right: '', font_size: 8 },
					disable_smart_shrinking: true,
					dpi: '96',
					margin: @configuracoes.margens_customizadas(top: 4)
				end
			end
		end

		def imprimir_conferencia
			@fontes_das_cotas_orcamentarias = FonteDaCotaOrcamentaria.joins(:cota_orcamentaria).where(loa_cotas_orcamentarias: {orcamento_id: contexto_atual.id})

			@configuracoes = Configuracao.last
			respond_to do |format|
				format.pdf do
					render pdf: "cotas_orcamentarias_conferencia",
					template: 'loa/cotas_orcamentarias/conferencia.pdf.slim',
					orientation: 'Landscape',
					header: {
						html: {
							template: 'layouts/_cabecalho_pdf.html.slim',
							locals: { titulo1: "Cotas Orçamentárias #{contexto_atual.exercicio}" , titulo2: "CONFERÊNCIA", titulo3: "" }
						},
						spacing: 0
					},
					footer: { right: '', font_size: 8 },
					disable_smart_shrinking: true,
					dpi: '96',
					margin: @configuracoes.margens_customizadas(top: 4)
				end
			end
		end

		private
		def set_cota_orcamentaria
			@cota_orcamentaria = CotaOrcamentaria.find( params[:id] )
		end

		# Permite apenas os parâmetros específicos
		def cota_orcamentaria_params
			params.require(:loa_cota_orcamentaria).permit(:unidade_orcamentaria_id, 
				fontes_das_cotas_orcamentarias_attributes: [:id, :valor, :percentual, :_destroy]
			)
		end
	end
end
