class Base::Relatorios::ContasBancariasController < 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
		relatorio = params[:relatorio].present? ? params[:relatorio] : tableless_relatorio_da_conta_bancaria_params[:relatorio]
		if respond_to? relatorio.to_s, :private
			loa = CombinePDF.new
			loa << CombinePDF.parse(send(relatorio))
			loa.number_pages(location: :bottom_right, margin_from_height: 0, number_format: '%s', font_size: 8)
			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

	private

	def movimentacoes_bancarias
		if tableless_relatorio_da_conta_bancaria_params[:logado_no_financeiro].present?
			conta_bancaria = Base::ContaBancaria.find(tableless_relatorio_da_conta_bancaria_params[:conta_bancaria])
			unidade_orcamentaria = tableless_relatorio_da_conta_bancaria_params[:unidade_orcamentaria].present? ? Loa::UnidadeOrcamentaria.find(tableless_relatorio_da_conta_bancaria_params[:unidade_orcamentaria]) : conta_bancaria.unidade_orcamentaria_principal(contexto_atual.id)
			@conta_bancaria_por_unidade_orcamentaria = conta_bancaria.conta_por_unidade(unidade_orcamentaria)
			movimentacoes_bancarias = conta_bancaria.contas_bancarias_por_unidade_orcamentaria.find(@conta_bancaria_por_unidade_orcamentaria.id).movimentacoes_da_conta_bancaria
		else
			@conta_bancaria_por_unidade_orcamentaria = Base::ContaBancariaPorUnidadeOrcamentaria.find(tableless_relatorio_da_conta_bancaria_params[:conta_bancaria_por_unidade_orcamentaria])
			conta_bancaria = Base::ContaBancaria.find(@conta_bancaria_por_unidade_orcamentaria.conta_bancaria.id)
			# movimentacoes_bancarias = conta_bancaria.contas_bancarias_por_unidade_orcamentaria.find(@conta_bancaria_por_unidade_orcamentaria.id).movimentacoes_da_conta_bancaria
			movimentacoes_bancarias = @conta_bancaria_por_unidade_orcamentaria.conta_bancaria.movimentacoes_do_exercicio(contexto_atual)
		end

		@exibir_fontes_de_recursos = tableless_relatorio_da_conta_bancaria_params[:check_fontes_de_recurso].to_i == 1
		@exibir_historico_de_movimentacoes = tableless_relatorio_da_conta_bancaria_params[:check_historico_de_movimentacoes].to_i == 1
		@numero_da_conta_bancaria = @conta_bancaria_por_unidade_orcamentaria.numero_agencia_e_banco
		@data_inicial = tableless_relatorio_da_conta_bancaria_params[:data_inicial].present? ? tableless_relatorio_da_conta_bancaria_params[:data_inicial].to_date : "01/01/#{exercicio_atual}".to_date
		@data_final = tableless_relatorio_da_conta_bancaria_params[:data_final].present? ? tableless_relatorio_da_conta_bancaria_params[:data_final].to_date : "31/12/#{exercicio_atual}".to_date
		@movimentacoes_bancarias = movimentacoes_bancarias.where("contabilidade_movimentacoes_da_conta_bancaria.data_da_movimentacao >= ? AND contabilidade_movimentacoes_da_conta_bancaria.data_da_movimentacao <= ?", @data_inicial, @data_final)
		@conta_bancaria_para_o_titulo = @conta_bancaria_por_unidade_orcamentaria.conta_bancaria.conta_caixa_pcasp? ? "#{@conta_bancaria_por_unidade_orcamentaria.conta_bancaria&.agencia&.banco&.try(:nome).to_s + '-' + @conta_bancaria_por_unidade_orcamentaria.conta_bancaria&.numero_e_nomenclatura}" : "#{@conta_bancaria_por_unidade_orcamentaria.conta_bancaria.nomenclatura}"
		@saldo = movimentacoes_bancarias.where('data_da_movimentacao < ?', @data_inicial).sum(:valor)
		movimentacoes_bancarias_render
	end

	def movimentacoes_bancarias_render
		render_to_string pdf: "movimentacoes_bancarias",
			template: "base/relatorios/contas_bancarias/movimentacoes_bancarias.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: {
						titulo1: "Relátorio de movimentações da conta báncaria",
						titulo2: "Ref:. #{@conta_bancaria_por_unidade_orcamentaria.unidade_orcamentaria.nome}",
						titulo3: "Conta: #{@conta_bancaria_por_unidade_orcamentaria.conta_bancaria.numero_e_nomenclatura}",
						titulo4: "Período de: #{@data_inicial} — #{@data_final}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 20)
	end

	def movimentacoes_bancarias_sinteticas
		if tableless_relatorio_da_conta_bancaria_params[:logado_no_financeiro].present?
			conta_bancaria = Base::ContaBancaria.find(tableless_relatorio_da_conta_bancaria_params[:conta_bancaria])
			unidade_orcamentaria = tableless_relatorio_da_conta_bancaria_params[:unidade_orcamentaria].present? ? Loa::UnidadeOrcamentaria.find(tableless_relatorio_da_conta_bancaria_params[:unidade_orcamentaria]) : conta_bancaria.unidade_orcamentaria_principal(contexto_atual.id)
			@conta_bancaria_por_unidade_orcamentaria = conta_bancaria.conta_por_unidade(unidade_orcamentaria)
		else
			@conta_bancaria_por_unidade_orcamentaria = Base::ContaBancariaPorUnidadeOrcamentaria.find(tableless_relatorio_da_conta_bancaria_params[:conta_bancaria_por_unidade_orcamentaria])
		end
		@exibir_fontes_de_recursos = tableless_relatorio_da_conta_bancaria_params[:check_fontes_de_recurso].to_i == 1
		@exibir_historico_de_movimentacoes = tableless_relatorio_da_conta_bancaria_params[:check_historico_de_movimentacoes].to_i == 1
		@numero_da_conta_bancaria = @conta_bancaria_por_unidade_orcamentaria.numero_agencia_e_banco
		movimentacoes_bancarias = @conta_bancaria_por_unidade_orcamentaria.movimentacoes_da_conta_bancaria
		@data_inicial = tableless_relatorio_da_conta_bancaria_params[:data_inicial].present? ? tableless_relatorio_da_conta_bancaria_params[:data_inicial].to_date : "01/01/#{exercicio_atual}".to_date
		@data_final = tableless_relatorio_da_conta_bancaria_params[:data_final].present? ? tableless_relatorio_da_conta_bancaria_params[:data_final].to_date : "31/12/#{exercicio_atual}".to_date
		@movimentacoes_bancarias = movimentacoes_bancarias.where("contabilidade_movimentacoes_da_conta_bancaria.data_da_movimentacao >= ? AND contabilidade_movimentacoes_da_conta_bancaria.data_da_movimentacao <= ?", @data_inicial, @data_final)
		@conta_bancaria_para_o_titulo = @conta_bancaria_por_unidade_orcamentaria.conta_bancaria.conta_caixa_pcasp? ? "#{@conta_bancaria_por_unidade_orcamentaria.conta_bancaria.agencia.banco.try(:nome) + '-' + @conta_bancaria_por_unidade_orcamentaria.conta_bancaria.numero_e_nomenclatura}" : "#{@conta_bancaria_por_unidade_orcamentaria.conta_bancaria.nomenclatura}"
		@saldo = movimentacoes_bancarias.where('data_da_movimentacao < ?', @data_inicial).sum(:valor)
		movimentacoes_bancarias_sinteticas_render
	end

	def movimentacoes_bancarias_sinteticas_render
		render_to_string pdf: "movimentacoes_bancarias",
			template: "base/relatorios/contas_bancarias/movimentacoes_bancarias_sinteticas.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: {
						titulo1: "Relátorio de movimentações da conta báncaria",
						titulo2: "Ref:. #{@conta_bancaria_por_unidade_orcamentaria.unidade_orcamentaria.nome}",
						titulo3: "Conta: #{@conta_bancaria_por_unidade_orcamentaria.conta_bancaria.numero_e_nomenclatura}",
						titulo4: "Período de: #{@data_inicial} — #{@data_final}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 20)
	end

	def divergencia_entre_contas_bancarias
		exercicio_anterior =  contexto_atual.exercicio - 1
		@orcamento_anterior = Orcamento.find_by(exercicio: exercicio_anterior)

		@contas_bancarias = Base::ContaBancaria.all

		render_to_string pdf: "divergencia_entre_contas_bancarias",
			template: "base/relatorios/contas_bancarias/divergencia_entre_contas_bancarias.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: {
						titulo1: "Relátorio de divergência entre as contas báncarias",
						titulo2: "Comparação entre " + @orcamento_anterior.exercicio.to_s + " e " + contexto_atual.exercicio.to_s
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end

	def disponibiliza_dependencias
		@configuracoes = Configuracao.last
	end

	def tableless_relatorio_da_conta_bancaria_params
		begin
			params.require(:tableless_relatorio_da_conta_bancaria).permit(
				:relatorio, :button, :data_inicial, :data_final, :conta_bancaria_por_unidade_orcamentaria, :unidade_orcamentaria, :conta_bancaria, :logado_no_financeiro, :check_fontes_de_recurso, :check_historico_de_movimentacoes, :fornecedor
			)
		rescue ActionController::ParameterMissing
			nil
		end
	end

end
