class Licitacao::Relatorios::ProjetosController < ApplicationController
	include ControllerConcern

	before_action -> { verifica_modulo_na_sessao(["administrativo", "controladoria", "licitacao","contabilidade"]) }
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:imprimir]
	before_action :set_projeto
	before_action :disponibiliza_dependencias

	def imprimir
		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 autorizacao
		@data_da_autorizacao = params[:data_do_pedido].to_date
		if @configuracoes.customizacao.exibir_numero_pb?
			titulo2 = numero_do_pb
		else
			titulo2 = ''
		end

		if params[:unidade_orcamentaria].present?
			@unidade_orcamentaria = Loa::UnidadeOrcamentaria.find_by_id(params[:unidade_orcamentaria])
			@orcamentos_da_despesa_por_projeto = @projeto.orcamentos_da_despesa_por_projetos.where("orcamento_da_despesa_id in (?)", @unidade_orcamentaria.orcamentos_da_despesa.ids)
		end

		@exige_brasao = @projeto.pedido.unidades_orcamentarias_por_pedido.size > 1

		render_to_string pdf: "autorizacao",
			template: "licitacao/relatorios/projetos/autorizacao.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: { titulo1: 'Autorização', titulo2: titulo2 }
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 7)
	end

	def projeto_basico
		if params[:data_do_projeto].present?
			@ano = params[:data_do_projeto].to_date.year
		end
		if params[:unidade_orcamentaria].present?
			@unidade_orcamentaria = Loa::UnidadeOrcamentaria.find_by(id: params[:unidade_orcamentaria])
			@unidade_orcamentaria_por_pedido = @projeto.unidades_orcamentarias_por_pedido.find_by(unidade_orcamentaria_id: @unidade_orcamentaria.id)
		elsif params[:contrato].present?
			@contrato = Licitacao::Contrato.find_by(id: params[:contrato])
			@unidade_orcamentaria = @contrato.unidade_orcamentaria
		elsif params[:aditivo].present?
			@aditivo = Licitacao::Aditivo.find_by(id: params[:aditivo])
			@unidade_orcamentaria = @aditivo.unidade_orcamentaria_atual
		else
			@unidade_orcamentaria = @projeto.pedido.unidade_orcamentaria
		end

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

		if @configuracoes.customizacao.exibir_numero_pb?
			titulo2 = numero_do_pb
		else
			titulo2 = ''
		end

		if params[:unidade_orcamentaria].present?
			@saldo = @projeto.valor_total_por_unidade(params[:unidade_orcamentaria]).to_f
		else
			if @projeto.maior_desconto?
				@saldo = @projeto.valor_estimado_global.to_f
			else
				if @projeto.pedido.por_valor_previsto? && @projeto.pedido.por_quantidade?
					@saldo = @projeto.valor_estimado_global.to_f
				elsif @projeto.pedido.por_valor_previsto?
					@saldo = @projeto.valor_estimado_por_item.to_f
				else
					@saldo = @projeto.valor_estimado_global
				end
			end
		end

		@orgao = @unidade_orcamentaria.orgao rescue nil

		render_to_string pdf: "projeto_basico",
			template: "licitacao/relatorios/projetos/projeto_basico.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: { titulo1: titulo1, titulo2: titulo2 }
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 7)
	end

	def projeto_simplificado
		if @configuracoes.customizacao.exibir_nome_orgao?
			titulo1 = @projeto.pedido.unidade_orcamentaria.orgao.nome
		else
			titulo1 = ''
		end

		if @configuracoes.customizacao.exibir_numero_pb?
			titulo2 = numero_do_pb
		else
			titulo2 = ''
		end

		@unidade_orcamentaria = @projeto.pedido.unidade_orcamentaria rescue nil

		render_to_string pdf: "projeto_basico",
			template: "licitacao/relatorios/projetos/projeto_simplificado.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: { titulo1: titulo1, titulo2: titulo2 }
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 7)
	end
	def relacao_de_projetos_simplificado
		@orcamentos = Orcamento.all.order(exercicio: :desc)
		orcamento = unless query_params["orcamento_id_eq"].blank?
			Orcamento.find(query_params["orcamento_id_eq"])
		else
			contexto_atual
		end
		@unidades_orcamentarias = orcamento.unidades_orcamentarias.includes([orgao: :orcamento])
		projetos_basicos = current_usuario.projetos.do_exercicio(orcamento.exercicio)
		projetos_basicos = projetos_basicos.includes([pedido: [unidade_orcamentaria: [:unidade_gestora, :orgao]]]).joins(:pedido).where(licitacao_pedidos: { projeto_simplificado: [nil, false] })
		@q = projetos_basicos.order("data_do_projeto DESC").search(params[:q])
		@lista_de_projetos = @q.result(distinct: true)
		render_to_string pdf: "relacao_de_projetos_simplificado",
			template: "licitacao/relatorios/projetos/relacao_de_projetos_simplificado.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: { titulo1: "Relação", titulo2: "Exercício de : #{contexto_atual.exercicio}" }
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end
	def itens_por_dotacao
		if @configuracoes.customizacao.exibir_numero_pb?
			titulo2 = numero_do_pb
		else
			titulo2 = ''
		end

		render_to_string pdf: "itens_por_dotacao",
			template: "licitacao/relatorios/projetos/itens_por_dotacao.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: { titulo1: "Itens do Projeto Por Dotação", titulo2: titulo2 }
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end

	def relacao_projetos_basicos

		if params[:unidade_orcamentaria].present? && params[:status].present?
			@lista_de_projetos = orcamento_atual.projetos.joins(pedido: :unidade_orcamentaria).where(status: params[:status]).where('loa_unidades_orcamentarias.id = ?', params[:unidade_orcamentaria])
		elsif params[:unidade_orcamentaria].present? && !params[:status].present?
			@lista_de_projetos = orcamento_atual.projetos.joins(pedido: :unidade_orcamentaria).where('loa_unidades_orcamentarias.id = ?', params[:unidade_orcamentaria])
		elsif !params[:unidade_orcamentaria].present? && params[:status].present?
			@lista_de_projetos = orcamento_atual.projetos.joins(pedido: :unidade_orcamentaria).where(status: params[:status])
		else
			@lista_de_projetos = orcamento_atual.projetos.all
		end

		render_to_string pdf: "relacao_projetos_basicos",
			template: "licitacao/relatorios/projetos/relacao_projetos_basicos.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: {
						titulo1: "Relação de Projetos",
						titulo2: "Exercício de: #{contexto_atual.exercicio}"
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)

	end

	private

	def set_projeto
		@projeto = Licitacao::Projeto.find(params[:projeto]) if params[:projeto].present?
	end

	def disponibiliza_dependencias
		@configuracoes = Configuracao.last
	end

	def numero_do_pb
		if params[:contrato].present?
			"PROJETO BÁSICO: #{@unidade_orcamentaria.try(:orgao).try(:codigo)}#{@unidade_orcamentaria.try(:codigo)}#{@contrato.try(:numero_da_solicitacao_do_contrato)}"
		else
			"PROJETO BÁSICO: #{@unidade_orcamentaria.try(:orgao).try(:codigo)}#{@unidade_orcamentaria.try(:codigo)}#{@projeto.pedido.try(:numero)}"
		end
	end
end
