class Administrativo::Relatorios:: EmpenhosController < ApplicationController
	include ControllerConcern

	skip_before_action :verifica_se_tem_orcamento_na_sessao!, only: [:imprimir], raise: false
	before_action :authenticate_usuario!
	before_action :autoriza_usuario! , except: [:imprimir]
	before_action :disponibiliza_dependencias

	def imprimir
		bloqueia_usuario_com_base_em :read, "empenhos"
		relatorio = params[:relatorio]

		if respond_to? relatorio.to_s, :private
			loa = CombinePDF.new
			loa << CombinePDF.parse(send(relatorio))
			send_data loa.to_pdf, filename: "#{relatorio}.pdf", type: "application/pdf", disposition: 'inline'
		else
			redirect_to :back, alert: 'Demonstrativo selecionado não existe'
		end
	end

	def solicitacao_de_empenho
		set_empenho

		if @configuracoes.customizacao.exibir_nome_orgao?
			titulo1 = @empenho.unidade_orcamentaria.unidade_gestora.nome.to_s
		else
			titulo1 = ''
		end

		if @empenho.reconhecimento_de_divida == true
			if params[:status] == "confirmado"
				titulo2 = "Reconhecimento de Dívida Nº #{@empenho.numero_do_empenho.to_s}"
			else
				titulo2 = "Reconhecimento de Dívida Nº #{@empenho.numero_da_solicitacao_do_empenho.to_s}"
			end
		else
			if params[:status] == "confirmado"
				titulo2 = "Empenho Nº #{@empenho.numero_do_empenho.to_s}"
			else
				titulo2 =  params[:doc_escolhido] == 'comunic_interna' ? "" : "Solicitação de Empenho Nº #{@empenho.numero_da_solicitacao_do_empenho.to_s}"
			end
		end

		@status_da_impressao = params[:status]

		doc_escolhido = params[:doc_escolhido]
		
		if doc_escolhido == 'comunic_interna'
			doc = 'sol_de_empenho_comunicacao_interna'
			tamanho = 8
		else
			doc = 'solicitacao_de_empenho'
			tamanho = 4
		end

		render_to_string pdf: "solicitacao_de_empenho",
			template: "administrativo/relatorios/empenhos/#{doc}.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			dpi: '96',
			page_size: 'A4',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: {
						titulo1: titulo1,
						titulo2: titulo2
					}
				},
				spacing: tamanho
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def nota_reconhecimento_do_passivo
		set_empenho
		@movimentacoes_de_reconhecimento = @empenho.movimentacoes_do_plano_de_contas.debito.joins(:evento_contabil).where('contabilidade_eventos_contabeis.classe in (51, 52)')

		titulo1 = "Nota de Reconhecimento do Passivo"

		@status_da_impressao = params[:status]

		render_to_string pdf: "nota_reconhecimento_do_passivo",
			template: "administrativo/relatorios/empenhos/nota_reconhecimento_do_passivo.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			dpi: '96',
			page_size: 'A4',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: {
						titulo1: titulo1,
						titulo2: ''
					}
				},
				spacing: 2
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def saldo_do_empenho
		set_empenho

		if @configuracoes.customizacao.exibir_nome_orgao?
			titulo1 = @empenho.unidade_orcamentaria.unidade_gestora.nome.to_s
		else
			titulo1 = ''
		end

		if @empenho.reconhecimento_de_divida == true
			titulo2 = "Reconhecimento de Dívida Nº #{@empenho.numero_do_empenho.to_s}"
		else
			if @empenho.solicitado?
				titulo2 = "Saldo da solicitação do empenho Nº #{@empenho.numero_da_solicitacao_do_empenho.to_s}"
			else
				titulo2 = "Saldo do Empenho Nº #{@empenho.numero_do_empenho.to_s}"
			end
		end

		render_to_string pdf: "saldo_do_empenho",
			template: "administrativo/relatorios/empenhos/saldo_do_empenho.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			page_size: 'A4',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: {
						titulo1: titulo1,
						titulo2: titulo2
					}
				},
				spacing: 4
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def controle_de_empenho
		set_empenho

		if @configuracoes.customizacao.exibir_nome_orgao?
			titulo1 = @empenho.unidade_orcamentaria.unidade_gestora.nome.to_s
		else
			titulo1 = ''
		end

		render_to_string pdf: "controle_de_empenho",
			template: "administrativo/relatorios/empenhos/controle_de_empenho.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			page_size: 'A4',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: {
						titulo1: titulo1,
						titulo2: "Controle de Empenho"
					}
				},
				spacing: 4
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def anulacao_do_empenho
		set_anulacao_do_empenho

		if @configuracoes.customizacao.exibir_nome_orgao?
			titulo1 = @anulacao_do_empenho.empenho.unidade_orcamentaria.unidade_gestora.nome.to_s
		else
			titulo1 = ''
		end

		render_to_string pdf: "anulacao_do_empenho",
			template: "administrativo/relatorios/empenhos/anulacao_do_empenho.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			page_size: 'A4',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: {
						titulo1: titulo1,
						titulo2: "Anulação de Empenho Nº #{@anulacao_do_empenho.numero_anulacao_do_empenho.to_s}"
					}
				},
				spacing: 4
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def anulacoes_dos_empenhos
		data_inicio_da_anulacao = params[:data_do_empenho_gteq].to_date
		data_final_da_anulacao = params[:data_do_empenho_lteq].to_date
		unidade_do_empenho = params[:unidade_orcamentaria_id]
		fornecedor = params[:fornecedor]
		elemento_de_despesa_por_subacao_id = params[:elemento_de_despesa_por_subacao]
		acao_id = params[:subacao]
		fonte_de_recursos_id = params[:fonte_de_recursos]
		nome_do_fornecedor = 'Todos os Fornecedores'
		status = params[:status]

		if unidade_do_empenho.present?
			anulacoes_do_empenho = contexto_atual.anulacoes_do_empenho.where('data_da_anulacao BETWEEN ? AND ?', data_inicio_da_anulacao, data_final_da_anulacao).joins(:empenho).where('contabilidade_empenhos.unidade_orcamentaria_id=?', unidade_do_empenho)
			unidade_gestora_nome = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria_id]).nome
		else
			anulacoes_do_empenho = contexto_atual.anulacoes_do_empenho.where('data_da_anulacao BETWEEN ? AND ?', data_inicio_da_anulacao, data_final_da_anulacao)
			unidade_gestora_nome = 'Todas as Unidades Gestoras'
		end

		if status.present?
			anulacoes_do_empenho = anulacoes_do_empenho.where(status: status)
		end

		if acao_id.present?
			anulacoes_do_empenho = anulacoes_do_empenho.joins(empenho:[orcamento_da_despesa: [elemento_de_despesa_por_subacao: [subacao: :acao]]]).where('loa_subacoes.acao_id =?', acao_id)
		end

		if elemento_de_despesa_por_subacao_id.present?
			anulacoes_do_empenho = anulacoes_do_empenho.joins(empenho:[orcamento_da_despesa: [elemento_de_despesa_por_subacao: :elemento_de_despesa]]).where('loa_elementos_de_despesa_por_subacao.elemento_de_despesa_id=?', elemento_de_despesa_por_subacao_id)
		end

		if fonte_de_recursos_id.present?
			anulacoes_do_empenho = anulacoes_do_empenho.joins(empenho: [orcamento_da_despesa: :fonte_de_recursos]).where("loa_orcamentos_da_despesa.fonte_de_recursos_id =?", fonte_de_recursos_id)
		end
		if fornecedor.present?
			anulacoes_do_empenho = anulacoes_do_empenho.joins(:empenho).where('contabilidade_empenhos.pessoa_id=?', fornecedor)
			nome_do_fornecedor = Base::Pessoa.find(fornecedor).nome_e_cpf_ou_cnpj
		end

		if anulacoes_do_empenho.any?
			@anulacoes_agrupadas = anulacoes_do_empenho.confirmados.group_by { |anulacao_do_empenho| [ anulacao_do_empenho.empenho.acao_codigo_e_nome, anulacao_do_empenho.empenho.orcamento_da_despesa.elemento_de_despesa_codigo_e_descricao, anulacao_do_empenho.empenho.fonte_de_recursos_codigo_e_descricao]}
		end

		render_to_string pdf: "anulacoes_dos_empenhos",
			template: "administrativo/relatorios/empenhos/anulacoes_dos_empenhos.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			page_size: 'A4',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: {
						titulo1: "Anulações dos Empenhos de #{unidade_gestora_nome}",
						titulo2: "Periodo das Anulações: De #{data_inicio_da_anulacao} Até #{data_final_da_anulacao} - Fornecedor: #{nome_do_fornecedor}"
					}
				}
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def empenhos_e_anulacoes
		data_inicio = params[:data_do_empenho_gteq].to_date
		data_final = params[:data_do_empenho_lteq].to_date
		unidade_do_empenho = params[:unidade_orcamentaria_id]
		fornecedor = params[:fornecedor]
		elemento_de_despesa_por_subacao_id = params[:elemento_de_despesa_por_subacao]
		acao_id = params[:subacao]
		fonte_de_recursos_id = params[:fonte_de_recursos]
		nome_do_fornecedor = 'Todos os Fornecedores'
		@valores_por_fonte = params[:valores_por_fonte]
		
		ransack_params = {}
		ransack_params["data_do_empenho_gteq"] = data_inicio if data_inicio.present?
		ransack_params["data_do_empenho_lteq"] = data_final if data_final.present?
		ransack_params["unidade_orcamentaria_id_eq"] = unidade_do_empenho if unidade_do_empenho.present?
		ransack_params["pessoa_id_eq"] = fornecedor if fornecedor.present?
		ransack_params["orcamento_da_despesa_elemento_de_despesa_por_subacao_elemento_de_despesa_id_eq"] = elemento_de_despesa_por_subacao_id if elemento_de_despesa_por_subacao_id.present?
		ransack_params["orcamento_da_despesa_fonte_de_recursos_id_in"] = fonte_de_recursos_id if fonte_de_recursos_id.present?
		
		@data_inicio = data_inicio.to_date
		@data_final = data_final.to_date
		anulacoes_empenhos = Contabilidade::AnulacaoDoEmpenho.ransack(ransack_params)
		@anulacoes = anulacoes_empenhos.result.confirmados
		empenhos = Contabilidade::Empenho.ransack(ransack_params)
		@empenhos = empenhos.result.confirmados_ou_anulados_e_superiores.where('data_do_empenho >= ? AND data_do_empenho <= ?', @data_inicio , @data_final)

		unidade_nome = unidade_do_empenho.present? ? Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria_id]).nome : 'Todas as Unidades Orçamentárias'
		@todas_fontes = @empenhos.group_by{ |emp| emp.orcamento_da_despesa.fonte_de_recursos.codigo_e_descricao }.uniq.sort

		if fornecedor.present?
			@fornecedor = Base::Pessoa.find(fornecedor)
		end

		render_to_string pdf: "anulacoes_dos_empenhos",
			template: "administrativo/relatorios/empenhos/empenhos_e_anulacoes.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			page_size: 'A4',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: {
						titulo1: "Empenhos e Anulações de #{unidade_nome}",
						titulo2: "Periodo: De #{data_inicio} Até #{data_final}"
					}
				}
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	private
	def set_empenho
		@empenho = Contabilidade::Empenho.find(params[:empenho_id])
		@unidade_orcamentaria = @empenho.unidade_orcamentaria
	end

	def set_anulacao_do_empenho
		@anulacao_do_empenho = Contabilidade::AnulacaoDoEmpenho.find(params[:anulacao_do_empenho])
		@empenho = @anulacao_do_empenho.empenho
	end

	def disponibiliza_dependencias
		@configuracoes = Configuracao.last
	end
end
