module Licitacao
	class InicioController < ApplicationController
		include TradutorConcern
		include ControllerConcern
		include LicitacaoControllersConcern
		include ApplicationHelper
		before_action :authenticate_usuario!
		before_action :autoriza_usuario!

		# GET /licitacao/inicios
		def index
			@filtro_inicio = Tableless::Filtro.new
			data_inicial = (!params[:tableless_filtro].nil? && !params[:tableless_filtro][:data_inicial].blank? ? params[:tableless_filtro][:data_inicial].to_date : ('01/01/'+"#{exercicio_atual}").to_date)
			data_final = (!params[:tableless_filtro].nil? && !params[:tableless_filtro][:data_final].blank? ? params[:tableless_filtro][:data_final].to_date : ('31/12/'+"#{exercicio_atual}").to_date)

			data_inicial = (Date.today.year == exercicio_atual ? data_inicial : '01/07/'+"#{exercicio_atual}").to_date if params[:tableless_filtro].nil?

			@filtro_inicio.data_inicial = data_inicial.to_date
			@filtro_inicio.data_final = data_final.to_date

			@processos_por_status = current_usuario.projetos.do_exercicio(exercicio_atual).where('licitacao_projetos.data_do_projeto >= ?', data_inicial)
				.where('licitacao_projetos.data_do_projeto <= ?', data_final).group('licitacao_projetos.status').distinct.count(:id)
					.sort.map {|status, count| [Licitacao::Projeto.localizar("status", status), count] }.to_h

			@pedidos_por_status = current_usuario.pedidos.do_exercicio(exercicio_atual).group('licitacao_pedidos.status')
				.where('licitacao_pedidos.data_do_pedido >= ?', data_inicial).where('licitacao_pedidos.data_do_pedido <= ?', data_final)
					.distinct.count(:id).sort.map {|status, count| [Licitacao::Pedido.localizar("status", status), count] }.to_h

			@pedidos_por_mes = current_usuario.pedidos.do_exercicio(exercicio_atual).select("to_char(date_trunc( 'month', data_do_pedido ), 'MM/YYYY')")
				.where('licitacao_pedidos.data_do_pedido >= ?', data_inicial).where('licitacao_pedidos.data_do_pedido <= ?', data_final)
					.group("date_trunc( 'month', data_do_pedido )").order("date_trunc( 'month', data_do_pedido ) asc").count(:id)
						.sort.map {|data, count| [data.strftime("%m/%Y"), count]}.to_h

			if Configuracao.last.qtd_dias_para_encerrar_o_contrato.present?
				@top_10_contratos_encerrando = current_usuario.contratos.do_exercicio(exercicio_atual)
					.where('licitacao_contratos.data_do_contrato >= ?', data_inicial)
						.where('licitacao_contratos.data_do_contrato <= ?', data_final)
							.select{|contrato| contrato if contrato.alertar_dias_para_encerrar_contrato?}
								.sort_by(&:tempo_restante).first(10).map {|contrato| [contrato.numero, contrato.tempo_restante]}.to_h
			end

			@fim_da_vigencia_do_contrato_por_subelemento = current_usuario.contratos.do_exercicio(exercicio_atual).where(status: 2)
				.where('licitacao_contratos.data_do_contrato >= ?', data_inicial).where('licitacao_contratos.data_do_contrato <= ?', data_final)
					.where('fim_da_vigencia >= ?', Date.today).joins(orcamentos_da_despesa_do_contrato: :sub_elemento_de_despesa)
						.group('contabilidade_sub_elementos_de_despesa.descricao').minimum(:fim_da_vigencia)
							.map {|sub_elemento_de_despesa, fim_da_vigencia| [sub_elemento_de_despesa, (Date.today..fim_da_vigencia).count] }.to_h

			@fim_da_vigencia_da_ata_por_subelemento = current_usuario.atas_de_registro_de_precos.do_exercicio(exercicio_atual)
				.joins(processo: [contratos: [orcamentos_da_despesa_do_contrato: :sub_elemento_de_despesa]])
					.where('licitacao_atas_de_registro_de_precos.data_inicio_de_vigencia >= ?', data_inicial).where('licitacao_atas_de_registro_de_precos.data_inicio_de_vigencia <= ?', data_final)
						.group('contabilidade_sub_elementos_de_despesa.descricao').minimum(:data_final_de_vigencia)
							.map {|sub_elemento_de_despesa, fim_da_vigencia| [sub_elemento_de_despesa, (Date.today..fim_da_vigencia).count] }.to_h

			@mensagem_de_alerta = mensagem_de_alerta
		end
	end
end
