class Loa::RelatoriosDaLoaController < ApplicationController
	include ControllerConcern
	include RelatoriosConcern

	before_action :disponibiliza_dependencias
	before_action :set_contexto

	def new
		@relatorio_da_loa = Tableless::RelatorioDaLoa.new(relatorio: params[:relatorio])
	end

	# seleciona um relatório para imprimir
	def selecionar_relatorio
		@relatorio_da_loa = Tableless::RelatorioDaLoa.new()
	end

	def imprimir
		@relatorio_da_loa = Tableless::RelatorioDaLoa.new(tableless_relatorio_da_loa_params)

		if(tableless_relatorio_da_loa_params[:button].eql?("pdf"))
			imprimir_em_pdf( @relatorio_da_loa )
		end
	end

	def imprimir_em_pdf(relatorio_da_loa)
		relatorio = relatorio_da_loa.relatorio
		if respond_to? relatorio.to_s, :private
			case relatorio.to_s
			when "proposta_de_lei_orcamentaria"
				@loa = pesquisa_proposta_de_lei_orcamentaria(relatorio_da_loa)
			when "quadro_detalhamento_despesa"
				@loa = pesquisa_quadro_detalhamento_despesa(relatorio_da_loa)
			when "demonstrativo_de_destinacao_da_receita"
				@loa = pesquisa_demonstrativo_de_destinacao_da_receita(relatorio_da_loa)
			when "demonstrativo_de_destinacao_da_despesa"
				@loa = pesquisa_demonstrativo_de_destinacao_da_despesa(relatorio_da_loa)
			when "despesa_dos_orcamentos_fiscal_e_seguridade_por_programa_e_unidade"
				@loa = pesquisa_despesa_dos_orcamentos_fiscal_e_seguridade_por_programa_e_unidade(relatorio_da_loa)
			when "relatorio_detalhamento_despesa_por_grupo"
				@loa = pesquisa_relatorio_detalhamento_despesa_por_grupo(relatorio_da_loa)
			end

			arquivo = CombinePDF.new
			arquivo << CombinePDF.parse(send(relatorio))
			arquivo.number_pages(location: :bottom_right, margin_from_height: 0, number_format: '%s', font_size: 8)
			send_data arquivo.to_pdf, filename: "#{relatorio.to_s}.pdf", type: "application/pdf", disposition: 'inline'
		else
			redirect_to new_loa_relatorios_da_loa_path, alert: 'Relatório selecionado não existe'
		end
	end

	def pesquisa_proposta_de_lei_orcamentaria(relatorio_da_loa)
		@data = @relatorio_da_loa.data.to_date
		ransack_params = {}
		ransack_params["lancamentos_do_orcamento_da_despesa_data_do_lancamento_gteq"] = @relatorio_da_loa.data.to_date.beginning_of_year if @relatorio_da_loa.data.present?
		ransack_params["lancamentos_do_orcamento_da_despesa_data_do_lancamento_lteq"] = @relatorio_da_loa.data.to_date if @relatorio_da_loa.data.present?
		if @relatorio_da_loa.unidade_orcamentaria.blank? || @relatorio_da_loa.unidade_orcamentaria == "consolidado"
			ransack_params["elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_id_in"] = @unidades_orcamentarias.pluck(:id)
		else
			ransack_params["elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_id_eq"] = @relatorio_da_loa.unidade_orcamentaria.to_i if @relatorio_da_loa.unidade_orcamentaria.present?
		end
		orcamento_da_despesa = Loa::OrcamentoDaDespesa.includes(elemento_de_despesa_por_subacao: [subacao: [acao: :programa_de_governo]]).ransack(ransack_params)
		@orcamentos_da_despesa = orcamento_da_despesa.result(distinct: false)
	end

	def proposta_de_lei_orcamentaria
		if @relatorio_da_loa.unidade_orcamentaria.present? && @relatorio_da_loa.unidade_orcamentaria == "consolidado"
			titulo2 = 'Consolidado'
		else
			titulo2 = @relatorio_da_loa.unidade_orcamentaria.blank? ? 'Todas as Unidades' : Loa::UnidadeOrcamentaria.find_by(id: @relatorio_da_loa.unidade_orcamentaria).try(:nome)
		end
		render_to_string pdf: "proposta_de_lei_orcamentaria",
			template: "loa/relatorios_da_loa/proposta_de_lei_orcamentaria.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: orcamento_titulo(contexto_atual.exercicio),
						titulo2: titulo2,
						titulo3: "Data: #{@relatorio_da_loa.data}"
					}
				},
				spacing: 5
			},
			margin: @configuracoes.margens_customizadas(top: 10)
	end

	def pesquisa_quadro_detalhamento_despesa relatorio_da_loa
		ransack_params = {}
		if @relatorio_da_loa.unidade_orcamentaria.present? && @relatorio_da_loa.unidade_orcamentaria != "consolidado"
			ransack_params["elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_id_eq"] = @relatorio_da_loa.unidade_orcamentaria.to_i if @relatorio_da_loa.unidade_orcamentaria.present?
		end

		if @relatorio_da_loa.unidade_orcamentaria.blank? || @relatorio_da_loa.unidade_orcamentaria == "consolidado"
			orcamento_da_despesa = Loa::OrcamentoDaDespesa.includes(elemento_de_despesa_por_subacao: [subacao: [acao: :programa_de_governo]]).joins(elemento_de_despesa_por_subacao: [subacao: :unidade_orcamentaria]).joins(:lancamentos_do_orcamento_da_despesa).where("loa_unidades_orcamentarias.id in (?) AND contabilidade_lancamentos_do_orcamento_da_despesa.modulo_type = 'Loa::OrcamentoDaDespesa'", @unidades_orcamentarias.pluck(:id)).ransack(ransack_params)
		else
			orcamento_da_despesa = contexto_atual.orcamentos_da_despesa.ransack(ransack_params)
		end
		@orcamentos_da_despesa = orcamento_da_despesa.result(distinct: false)
	end

	def quadro_detalhamento_despesa
		titulo4 = @relatorio_da_loa.unidade_orcamentaria.blank? ? 'Todas as Unidades' : ""
		titulo3 = @relatorio_da_loa.unidade_orcamentaria === "consolidado" ? "Consolidado" : ""
		render_to_string pdf: "quadro_detalhamento_despesa",
			template: "loa/relatorios_da_loa/quadro_detalhamento_despesa.pdf.slim",
			orientation: 'Landscape',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: orcamento_titulo(contexto_atual.exercicio),
						titulo2: "Quadro de Detalhamento de Despesa",
						titulo3: titulo3,
						titulo4: titulo4
					}
				},
				spacing: 5
			},
			margin: @configuracoes.margens_customizadas(top: 22)
	end

	def pesquisa_demonstrativo_de_destinacao_da_receita relatorio_da_loa
		@orcamentos_da_receita = contexto_atual.orcamentos_da_receita
	end

	def demonstrativo_de_destinacao_da_receita 
		render_to_string pdf: "demonstrativo_de_destinacao_da_receita",
			template: "loa/relatorios_da_loa/demonstrativo_de_destinacao_da_receita.pdf.slim",
			orientation: 'Landscape',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: orcamento_titulo(contexto_atual.exercicio),
						titulo2: "Demonstrativo de Destinação da Receita"
					}
				},
				spacing: 5
			},
			margin: @configuracoes.margens_customizadas(top: 20)
	end

	def pesquisa_despesa_dos_orcamentos_fiscal_e_seguridade_por_programa_e_unidade relatorio_da_loa
		@orcamentos_da_despesa = contexto_atual.orcamentos_da_despesa.joins(elemento_de_despesa_por_subacao: [subacao: :unidade_orcamentaria]).where(loa_unidades_orcamentarias: {id: @unidades_orcamentarias.pluck(:id)})
	end

	def despesa_dos_orcamentos_fiscal_e_seguridade_por_programa_e_unidade
		render_to_string pdf: "despesa_dos_orcamentos_fiscal_e_seguridade_por_programa_e_unidade",
			template: "loa/relatorios_da_loa/despesa_dos_orcamentos_fiscal_e_seguridade_por_programa_e_unidade.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: orcamento_titulo(contexto_atual.exercicio),
						titulo2: "Relatório de Despesa dos Orçamentos Fiscal e Seguridade Social por Programa e Unidade Orçamentária"
					}
				},
				spacing: 5
			},
			margin: @configuracoes.margens_customizadas(top: 20)
	end

	def pesquisa_demonstrativo_de_destinacao_da_despesa relatorio_da_loa
		@orcamentos_da_despesa = Loa::OrcamentoDaDespesa.includes(elemento_de_despesa_por_subacao: [subacao: [acao: :programa_de_governo]]).joins(elemento_de_despesa_por_subacao: [subacao: :unidade_orcamentaria]).where(loa_unidades_orcamentarias: {id: @unidades_orcamentarias.pluck(:id)})
	end

	def demonstrativo_de_destinacao_da_despesa
		render_to_string pdf: "demonstrativo_de_destinacao_da_despesa",
			template: "loa/relatorios_da_loa/demonstrativo_de_destinacao_da_despesa.pdf.slim",
			orientation: 'Landscape',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: orcamento_titulo(contexto_atual.exercicio),
						titulo2: "Demonstrativo de Destinação da Despesa"
					}
				},
				spacing: 5
			},
			margin: @configuracoes.margens_customizadas(top: 22)
	end

	def pesquisa_relatorio_detalhamento_despesa_por_grupo relatorio_da_loa
		ransack_params = {}
		if @relatorio_da_loa.unidade_orcamentaria.present? && @relatorio_da_loa.unidade_orcamentaria != "consolidado"
			ransack_params["elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_id_eq"] = @relatorio_da_loa.unidade_orcamentaria.to_i if @relatorio_da_loa.unidade_orcamentaria.present?
		end

		orcamento_da_despesa = contexto_atual.orcamentos_da_despesa.ransack(ransack_params)
		@orcamentos_da_despesa = orcamento_da_despesa.result(distinct: false)
	end

	def relatorio_detalhamento_despesa_por_grupo
		titulo4 = @relatorio_da_loa.unidade_orcamentaria.blank? ? 'Todas as Unidades' : ""
		titulo3 = @relatorio_da_loa.unidade_orcamentaria === "consolidado" ? "Consolidado" : ""
		render_to_string pdf: "relatorio_de_detalhamento_de_despesa_por_grupo",
			template: "loa/relatorios_da_loa/relatorio_de_detalhamento_de_despesa_por_grupo.pdf.slim",
			orientation: 'Landscape',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_da_contabilidade.html.slim',
					locals: {
						titulo1: orcamento_titulo(contexto_atual.exercicio),
						titulo2: "Relatório de Detalhamento de Despesa por Grupo e Modalidade",
						titulo3: titulo3,
						titulo4: titulo4
					}
				},
				spacing: 5
			},
			margin: @configuracoes.margens_customizadas(top: 20)
	end

	private

	def disponibiliza_dependencias
		@configuracoes = Configuracao.last

		if current_usuario.desenvolvedor?
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.order(:codigo, :nome)
		else
			@unidades_orcamentarias = current_usuario.unidades_orcamentarias.joins(:orgao).where('loa_orgaos.orcamento_id = ?', contexto_atual.id).order(:codigo, :nome).uniq
		end

		@meses = [
			["Janeiro", 1], ["Fevereiro", 2], ["Março", 3], ["Abril", 4], ["Maio", 5], ["Junho", 6], 
			["Julho", 7], ["Agosto", 8], ["Setembro", 9], ["Outubro", 10], ["Novembro", 11], ["Dezembro", 12]
		]
	end

	def set_contexto
		@contexto = contexto_atual
	end

	def tableless_relatorio_da_loa_params
		begin
			params.require(:tableless_relatorio_da_loa).permit(
				:relatorio, :button, :unidade_orcamentaria, :mes, :data
			)
		rescue ActionController::ParameterMissing
			nil
		end
	end

end
