class Licitacao::Relatorios::ProcessosController < 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]
		if respond_to? relatorio.to_s, :private
			loa = CombinePDF.new
			loa << CombinePDF.parse(send(relatorio))

			if params[:documentos_do_processo_id].present?
				@documento = Licitacao::DocumentoDoProcesso.find(params[:documentos_do_processo_id])
				if @documento.termo_de_referencia? || @documento.edital? || @documento.minuta_do_edital? || @documento.minuta_de_contrato?
					loa.number_pages(location: :bottom_right, margin_from_height: 0, number_format: '%s', font_size: 8)
				end
			end

			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 imprimir_doc
		relatorio = params[:relatorio]
		request.format = "docx"
		respond_to do |format|
			format.docx {
				@documento_do_processo = Licitacao::DocumentoDoProcesso.find(params[:documentos_do_processo_id])
				response.headers['Content-Type'] = 'text/txt'
				response.headers['Content-Disposition'] = "attachment; filename=documento.docx"
				render template: "licitacao/relatorios/processos/documento.docx.slim"
			}
		end
	end

	private

	def documento
		@documento_do_processo = Licitacao::DocumentoDoProcesso.find(params[:documentos_do_processo_id])
		processo = @documento_do_processo.processo
		pedido = processo.pedido

		if @documento_do_processo.outros_documentos?
			primeiro_titulo = "" # Regra a pedido da Consultoria(Edson), quando for Outros Documentos não deve sair no cabeçalho
		elsif @documento_do_processo.edital? || @documento_do_processo.anexos_do_edital?
			primeiro_titulo =  @documento_do_processo.localizar(:tipo_de_documento)
		else
			if @configuracoes.customizacao.exibir_nome_orgao?
				primeiro_titulo = pedido.unidade_orcamentaria.nome || @documento_do_processo.localizar(:tipo_de_documento)
			elsif !@documento_do_processo.personalizado?
				primeiro_titulo = @documento_do_processo.localizar(:tipo_de_documento)
			else
				primeiro_titulo = ""
			end
		end

		if @documento_do_processo.documento_do_projeto || processo.numero_do_processo.nil?
			if @configuracoes.customizacao.exibir_numero_pb?
				numero_processo = ""
				numero_processo << pedido.unidade_orcamentaria.codigo_completo if pedido.unidade_orcamentaria.present?
				numero_processo << pedido.numero
				segundo_titulo = "PROJETO BÁSICO Nº #{numero_processo}"
			else
				segundo_titulo = ""
			end
		else
			if @configuracoes.customizacao.exibir_numero_processo?
				numero_processo = processo.numero_do_processo
				segundo_titulo = "PROCESSO Nº #{numero_processo}"
			else
				segundo_titulo = ""
			end
		end

		@exige_brasao = true

		if @documento_do_processo.processo.unidades_orcamentarias.count == 1
			@unidade_orcamentaria = @documento_do_processo.processo.unidades_orcamentarias.first
		end

		render_to_string pdf: "documento",
			template: "licitacao/relatorios/processos/documento.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: { titulo1: primeiro_titulo, titulo2: segundo_titulo }
				},
				spacing: 10
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end

	def ata_de_registro_de_precos
		@ata_de_registro_de_precos = Licitacao::AtaDeRegistroDePrecos.find(params[:ata_de_registro_de_precos_id])

		if @configuracoes.customizacao.exibir_numero_pb?
			titulo2 = "Processo Nº #{@ata_de_registro_de_precos.try(:processo).try(:numero_do_processo)}"
		else
			titulo2 = ''
		end

		render_to_string pdf: "ata_de_registro_de_precos",
			template: "licitacao/relatorios/ata_de_registro_de_precos/template_impressao.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: {
						titulo1: "Ata de registro de preços N° #{@ata_de_registro_de_precos.try(:numero)}",
						titulo2: titulo2
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end

	def saldo_da_ata_por_processo
		@processo = Licitacao::Projeto.find(params[:processo_id])
		@unidade_orcamentaria = unidade_orcamentaria rescue nil

		render_to_string pdf: "saldo_da_ata_por_processo",
		template: "licitacao/relatorios/processos/saldo_da_ata_por_processo.pdf.slim",
		orientation: 'Portrait',
		disable_smart_shrinking: true,
		

		dpi: '96',
		header: {
			html: {
				template: 'layouts/_cabecalho_pdf_relatorios_licitacao.html.slim',
				locals: {
					titulo1: "Saldo da Ata por Processo",
					titulo2: "",
					titulo3: ""
				}
			},
			spacing: 0
		},
		footer: {
			html: {
				template: 'layouts/_rodape_pdf.html.slim'
			}
		},
		margin: { top: 30, bottom: 10, left: 15, right: 15 }
	end

	def saldo_da_ata
		@ata_de_registro_de_precos = Licitacao::AtaDeRegistroDePrecos.find(params[:ata_de_registro_de_precos_id])
		render_to_string pdf: "saldo_da_ata",
		template: "licitacao/relatorios/processos/saldo_da_ata.pdf.slim",
		orientation: 'Portrait',
		disable_smart_shrinking: true,

		dpi: '96',
		header: {
			html: {
				template: 'layouts/_cabecalho_pdf_relatorios_licitacao.html.slim',
				locals: {
					titulo1: "Saldo da Ata por Processo",
					titulo2: "Data da Emissão: #{Date.today}",
					titulo3: ""
				}
			},
			spacing: 0
		},
		footer: {
			html: {
				template: 'layouts/_rodape_pdf.html.slim'
			}
		},
		margin: { top: 30, bottom: 10, left: 15, right: 15 }
	end

	def processos_por_modalidade_de_licitacao
		if params[:unidade_orcamentaria].present?
			unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria].to_i)
			unidades_orcamentarias_ids = unidade_orcamentaria.unidades_orcamentarias_de_exercicios_anteriores_ids

			@processos = orcamento_atual.processos.joins(pedido: :unidade_orcamentaria).where(loa_unidades_orcamentarias: {id: unidades_orcamentarias_ids} ).despachados
			unidade_escolhida = 'Unidade Orçamentária: ' + unidade_orcamentaria.codigo_completo_e_nome
		else
			@processos = orcamento_atual.processos.despachados
			unidade_escolhida = ''
		end

		render_to_string pdf: "processos_por_modalidade_de_licitacao",
			template: "licitacao/relatorios/processos/processos_por_modalidade_de_licitacao.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_licitacao.html.slim',
					locals: {
						titulo1: "Mapa de Processos por Tipo e Modalidade de Licitação",
						titulo2: unidade_escolhida,
						titulo3: "Período 01/01/" + orcamento_atual.exercicio.to_s + " - 31/12/" + orcamento_atual.exercicio.to_s
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end

	def relacao_de_processos_de_compra_e_contrato

		if params[:unidade_orcamentaria].present?
			unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria].to_i)
			unidades_orcamentarias_ids = unidade_orcamentaria.unidades_orcamentarias_de_exercicios_anteriores_ids

		  processos_filtrados = orcamento_atual.processos.joins(pedido: :unidade_orcamentaria).where(loa_unidades_orcamentarias: {id: unidades_orcamentarias_ids} ).joins(:contratos).distinct
			unidade_escolhida = 'Unidade Orçamentária: ' + unidade_orcamentaria.codigo_completo_e_nome
		else
			processos_filtrados = orcamento_atual.processos.joins(:contratos).distinct
			unidade_escolhida = ''
		end

		@processos = Licitacao::Relatorios::RelacaoDeProcessosDeCompraEContrato.dados_relatorio(processos_filtrados)

		render_to_string pdf: "relacao_de_processos_de_compra_e_contrato",
			template: "licitacao/relatorios/processos/relacao_de_processos_de_compra_e_contrato.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_licitacao.html.slim',
					locals: {
						titulo1: "Relação de Processos de Compra e Contratos",
						titulo2: unidade_escolhida,
						titulo3: "Período 01/01/" + orcamento_atual.exercicio.to_s + " - 31/12/" + orcamento_atual.exercicio.to_s
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end

	def relacao_de_abertura_de_processos
		if params[:unidade_orcamentaria].present?
			unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria].to_i)
			unidades_orcamentarias_ids = unidade_orcamentaria.unidades_orcamentarias_de_exercicios_anteriores_ids

			@processos = orcamento_atual.processos.joins(pedido: :unidade_orcamentaria).where.not(modalidade_do_processo: ["dispensa_de_licitacao", "inexigibilidade_de_licitacao", "parceria_osc"]).where(loa_unidades_orcamentarias: {id: unidades_orcamentarias_ids} )
			unidade_escolhida = 'Unidade Orçamentária: ' + unidade_orcamentaria.codigo_completo_e_nome
		else
		  @processos = orcamento_atual.processos.where.not(modalidade_do_processo: ["dispensa_de_licitacao", "inexigibilidade_de_licitacao", "parceria_osc"])
			unidade_escolhida = ''
		end

		render_to_string pdf: "relacao_de_abertura_de_processos",
			template: "licitacao/relatorios/processos/relacao_de_abertura_de_processos.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_licitacao.html.slim',
					locals: {
						titulo1: "Relação de Abertura de Processos Licitatórios",
						titulo2: unidade_escolhida,
						titulo3: "Período 01/01/" + orcamento_atual.exercicio.to_s + " - 31/12/" + orcamento_atual.exercicio.to_s
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end

	def relacao_de_licitacoes_em_andamento
		if params[:unidade_orcamentaria].present?
			unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria].to_i)
			unidades_orcamentarias_ids = unidade_orcamentaria.unidades_orcamentarias_de_exercicios_anteriores_ids

		  @processos = orcamento_atual.processos.joins(pedido: :unidade_orcamentaria).where.not(status: ["homologado", "fracassado", "suspenso", "desertado", "cancelado"]).where(loa_unidades_orcamentarias: {id: unidades_orcamentarias_ids} )
			unidade_escolhida = 'Unidade Orçamentária: ' + unidade_orcamentaria.codigo_completo_e_nome
		else
		  @processos = orcamento_atual.processos.where.not(status: ["homologado", "fracassado", "suspenso", "desertado", "cancelado"])
			unidade_escolhida = ''
		end

		render_to_string pdf: "relacao_de_licitacoes_em_andamento",
			template: "licitacao/relatorios/processos/relacao_de_licitacoes_em_andamento.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_licitacao.html.slim',
					locals: {
						titulo1: "Relação de Licitações em Andamento",
						titulo2: unidade_escolhida,
						titulo3: "Período 01/01/" + orcamento_atual.exercicio.to_s + " - 31/12/" + orcamento_atual.exercicio.to_s
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end

	def relacao_de_processos_de_compra_e_proposta

		if params[:unidade_orcamentaria].present?
			unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria].to_i)
			unidades_orcamentarias_ids = unidade_orcamentaria.unidades_orcamentarias_de_exercicios_anteriores_ids

		  processos_filtrados = orcamento_atual.processos.joins(pedido: :unidade_orcamentaria).where.not(status: ["homologado", "fracassado", "suspenso", "desertado", "cancelado"]).where(loa_unidades_orcamentarias: {id: unidades_orcamentarias_ids} )
			unidade_escolhida = 'Unidade Orçamentária: ' + unidade_orcamentaria.codigo_completo_e_nome
		else
		  processos_filtrados = orcamento_atual.processos.where.not(status: ["homologado", "fracassado", "suspenso", "desertado", "cancelado"])
			unidade_escolhida = ''
		end

		@processos =  Licitacao::Relatorios::RelacaoDeProcessosDeCompraEProposta.dados_relatorio(processos_filtrados)

		render_to_string pdf: "relacao_de_processos_de_compra_e_proposta",
			template: "licitacao/relatorios/processos/relacao_de_processos_de_compra_e_proposta.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_licitacao.html.slim',
					locals: {
						titulo1: "Relação de Processos de Compra e Proposta",
						titulo2: unidade_escolhida,
						titulo3: "Período 01/01/" + orcamento_atual.exercicio.to_s + " - 31/12/" + orcamento_atual.exercicio.to_s
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end

	def relacao_de_processos_por_modalidade_status_e_comissao

		if params[:unidade_orcamentaria].present?
			unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria].to_i)
			unidades_orcamentarias_ids = unidade_orcamentaria.unidades_orcamentarias_de_exercicios_anteriores_ids

			@processos = orcamento_atual.processos.joins(pedido: :unidade_orcamentaria).where(loa_unidades_orcamentarias: {id: unidades_orcamentarias_ids} )
			unidade_escolhida = 'Unidade Orçamentária: ' + unidade_orcamentaria.codigo_completo_e_nome
		else
			@processos = orcamento_atual.processos
			unidade_escolhida = ''
		end

		render_to_string pdf: "relacao_de_processos_por_modalidade_status_e_comissao",
			template: "licitacao/relatorios/processos/relacao_de_processos_por_modalidade_status_e_comissao.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_licitacao.html.slim',
					locals: {
						titulo1: "Relação de Processos por Período, Status e Comissão de Licitação",
						titulo2: unidade_escolhida,
						titulo3: "Período 01/01/" + orcamento_atual.exercicio.to_s + " - 31/12/" + orcamento_atual.exercicio.to_s
					}
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end

	def resumo_de_procedimento_licitatorio_por_modalidade_de_licitacao
		if params[:unidade_orcamentaria].present?
			unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria].to_i)
			unidades_orcamentarias_ids = unidade_orcamentaria.unidades_orcamentarias_de_exercicios_anteriores_ids

		  @processos = orcamento_atual.processos.joins(pedido: :unidade_orcamentaria).where(loa_unidades_orcamentarias: {id: unidades_orcamentarias_ids} )
			unidade_escolhida = 'Unidade Orçamentária: ' + unidade_orcamentaria.codigo_completo_e_nome
		else
			@processos = orcamento_atual.processos
			unidade_escolhida = ''
		end

		render_to_string pdf: "resumo_de_procedimento_licitatorio_por_modalidade_de_licitacao",
			template: "licitacao/relatorios/processos/resumo_de_procedimento_licitatorio_por_modalidade_de_licitacao.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf_relatorios_licitacao.html.slim',
					locals: {
						titulo1: "Resumo de Procedimento Licitatório por Modalidade de Licitação",
						titulo2: unidade_escolhida,
						titulo3: "Período 01/01/" + orcamento_atual.exercicio.to_s + " - 31/12/" + orcamento_atual.exercicio.to_s }
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end

	def capa_do_edital
		@configuracoes = Configuracao.last
		@processo = Licitacao::Processo.find(params[:processo_id])

		render_to_string pdf: "documento",
			template: "licitacao/relatorios/processos/capa_do_edital.pdf.slim",
			orientation: 'Portrait',
			dpi: '96'
	end

	def capa_da_dispensa
		@configuracoes = Configuracao.last
		@processo = Licitacao::Processo.find(params[:processo_id])

		render_to_string pdf: "documento",
			template: "licitacao/relatorios/processos/capa_da_dispensa.pdf.slim",
			orientation: 'Portrait',
			dpi: '96'
	end

	def ata_da_sessao
		@processo = Licitacao::Processo.find(params[:processo_id])
		@unidade_orcamentaria = @processo.pedido.unidade_orcamentaria rescue nil

		if @configuracoes.customizacao.exibir_numero_pb?
			titulo2 = "Processo: #{@processo.try(:numero_do_processo)}"
		else
			titulo2 = ''
		end

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

		render_to_string pdf: "ata_da_sessao",
			template: "licitacao/relatorios/processos/ata_da_sessao.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: { titulo1: "Ata da Sessão", titulo2: titulo2 }
				},
				spacing: 0
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end

	def resumo_do_processo
		@processo = Licitacao::Processo.find(params[:processo_id])
		@unidade_orcamentaria = @processo.pedido.unidade_orcamentaria rescue nil

		if @configuracoes.customizacao.exibir_numero_pb?
			titulo2 = "Processo: #{@processo.try(:numero_do_processo)}"
		else
			titulo2 = ''
		end

		render_to_string pdf: "resumo_do_processo",
			template: "licitacao/relatorios/processos/resumo_do_processo.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: { titulo1: "Resumo do Processo", titulo2: titulo2 }
				},
				spacing: 0
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end

	def itens_do_processo
		@processo = Licitacao::Processo.find(params[:processo_id])
		@unidade_orcamentaria = @processo.pedido.unidade_orcamentaria rescue nil
		if @configuracoes.customizacao.exibir_numero_pb?
			titulo2 = "Processo: #{@processo.try(:numero_do_processo)}"
		else
			titulo2 = ''
		end

		render_to_string pdf: "itens_do_processo",
			template: "licitacao/relatorios/processos/itens_do_processo.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: { titulo1: "Itens do Processo", titulo2: titulo2 }
				},
				spacing: 0
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end

	def parecer
		@parecer = Controladoria::Visto.find(params[:parecer_id])
		if params[:tipo_visto] == "Licitacao::Projeto"
			@projeto = Licitacao::Projeto.find(params[:id_do_tipo])
		end

		if params[:tipo_visto] == "Contabilidade::Empenho"
			@empenho = Contabilidade::Empenho.find(params[:id_do_tipo])
		end

		if params[:tipo_visto] == "Contabilidade::Liquidacao"
			@liquidacao =  Contabilidade::Liquidacao.find(params[:id_do_tipo])
		end

		render_to_string pdf: "parecer",
			template: "licitacao/relatorios/processos/parecer.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: { titulo1: "Parecer", titulo2: "" }
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end

	def disponibiliza_dependencias
		@configuracoes = Configuracao.last
	end
end
