module Administrativo
	class InicioController < ApplicationController
		include ControllerConcern
		include AdministrativoControllersConcern
		include ApplicationHelper
		before_action :authenticate_usuario!
		before_action :autoriza_usuario!

		# GET /administrativo/inicio
		def index
			@filtro_inicio = Tableless::Filtro.new
			if Date.today.year == exercicio_atual
				data_inicial = (!params[:tableless_filtro].nil? && !params[:tableless_filtro][:data_inicial].blank? ? params[:tableless_filtro][:data_inicial].to_date : (Date.today - 1.months))
				data_final = (!params[:tableless_filtro].nil? && !params[:tableless_filtro][:data_final].blank? ? params[:tableless_filtro][:data_final].to_date : (Date.today + 3.months))
			else
				data_inicial = (!params[:tableless_filtro].nil? && !params[:tableless_filtro][:data_inicial].blank? ? params[:tableless_filtro][:data_inicial].to_date : ('01/07/'+"#{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)
			end

			@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.status in (?)', [0,5,89,90,99])
			.where('licitacao_projetos.data_do_projeto >= ?', data_inicial).where('licitacao_projetos.data_do_projeto <= ?', data_final)
				.group('licitacao_projetos.status').count(:id).map {|status, count| [Licitacao::Projeto.localizar("status", status), count] }.to_h

			@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

			elementos_de_despesa_ids = Base::ElementoDeDespesa.ativos.joins(:elemento_de_gasto).where('natureza_da_despesa_elementos_de_despesa.codigo in (?)', ["30","31","32","36","39","52"]).distinct(:elemento_de_gasto_id).ids
			@valor_compra_direta_por_subelemento = current_usuario.empenhos.do_exercicio(exercicio_atual).where('contabilidade_empenhos.contrato_id is null')
				.where('contabilidade_empenhos.data_do_empenho >= ?', data_inicial).where('contabilidade_empenhos.data_do_empenho <= ?', data_final)
					.joins(sub_elemento_de_despesa: :elemento_de_despesa).where('base_elementos_de_despesa.id in (?)', elementos_de_despesa_ids)
						.group('contabilidade_sub_elementos_de_despesa.descricao').sum(:valor).map {|sub_elemento_de_despesa, valor_total| [sub_elemento_de_despesa, valor_total.to_f.round(2)] }.to_h

			if !params[:tableless_filtro].nil? && params[:tableless_filtro][:mostrar_acompanhamento_da_exec_do_contrato].present? && params[:tableless_filtro][:mostrar_acompanhamento_da_exec_do_contrato] == "true"
				query_data_do_contrato = current_usuario.contratos.do_exercicio(exercicio_atual).left_joins(:aditivos).where("licitacao_aditivos.fim_da_vigencia is not null and licitacao_aditivos.fim_da_vigencia >= ? and licitacao_aditivos.fim_da_vigencia <= ? OR (licitacao_aditivos.contrato_id is null and licitacao_contratos.fim_da_vigencia >= ? and licitacao_contratos.fim_da_vigencia <= ?)", data_inicial, data_final, data_inicial, data_final)
				contratos_vigentes_a_empenhar = query_data_do_contrato.where('licitacao_contratos.fim_da_vigencia >= ?', Date.today).joins("LEFT JOIN contabilidade_empenhos ON licitacao_contratos.id = contabilidade_empenhos.contrato_id").where("contabilidade_empenhos.contrato_id IS NULL").to_a

				contratos_vigentes_empenhado_total = query_data_do_contrato.where('licitacao_contratos.fim_da_vigencia >= ?', Date.today).select(&:empenhado_total?)
				contratos_vigentes_empenhado_parcial = query_data_do_contrato.where('licitacao_contratos.fim_da_vigencia >= ?', Date.today).select(&:empenhado_parcial?)
				contratos_vigentes_liquidado = query_data_do_contrato.where('licitacao_contratos.fim_da_vigencia >= ?', Date.today).select(&:liquidado?)
				@contratos_vigentes_por_etapas_de_despesa = {"A Empenhar" => contratos_vigentes_a_empenhar.sum(&:valor_total_do_contrato).to_f.round(2),
						"Empenhado total" => contratos_vigentes_empenhado_total.sum(&:valor_total_do_contrato).to_f.round(2),
						"Empenhado parcial" => contratos_vigentes_empenhado_parcial.sum(&:valor_empenhado).to_f.round(2),
						"Liquidado" => contratos_vigentes_liquidado.sum(&:valor_liquidado_total).to_f.round(2)
					}
				@filtro_inicio.mostrar_acompanhamento_da_exec_do_contrato = true
			else
				@contratos_vigentes_por_etapas_de_despesa = {"Dados indisponíveis" => 0}
				@filtro_inicio.mostrar_acompanhamento_da_exec_do_contrato = false
			end

			@cinco_primeiros_contratos_vigentes_encerrando = current_usuario.contratos.do_exercicio(exercicio_atual).where('fim_da_vigencia >= ?', Date.today).order(:fim_da_vigencia).first(5).map {|contrato| [contrato.numero, (Date.today..contrato.fim_da_vigencia).count] }.to_h

			@mensagem_de_alerta = mensagem_de_alerta
			@empenhos_retornados_pela_controladoria = Contabilidade::Empenho.where(status: Contabilidade::Empenho.status[:retornado_pela_controladoria])
			@empenhos_retornados_pela_contabilidade = Contabilidade::Empenho.where(status: Contabilidade::Empenho.status[:retornado_pela_contabilidade])

			@liquidacoes_retornadas_pela_controladoria = Contabilidade::Liquidacao.where(status: Contabilidade::Liquidacao.status[:retornado_pela_controladoria])
			@liquidacoes_retornadas_pela_contabilidade = Contabilidade::Liquidacao.where(status: Contabilidade::Liquidacao.status[:retornado_pela_contabilidade])
		end
	end

end
