class Controladoria::ContratosController < ApplicationController
	include ControladoriaControllersConcern
	include ControllerConcern
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:solicitacoes ]
	before_action :set_contrato, only: [:enviar_para_licitacao, :enviar_para_confirmar_contrato, :show, :enviar_para_copfin, :retornar_para_licitacao]

	# GET /controladoria/contratos
	def index
		@unidades_por_usuario_ids = current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id)
		@unidades_orcamentarias = Loa::UnidadeOrcamentaria.joins(orgao: :orcamento).where('loa_unidades_orcamentarias.id in (?)', @unidades_por_usuario_ids).order("orcamentos.exercicio DESC")
		@pessoas = Base::Pessoa.includes(:tipo_de_pessoa).fornecedores
		@url_contratos = controladoria_contratos_path

		if query_params["numero_eq"].present?
			@q = Licitacao::Contrato.where.not(fim_da_vigencia: nil).ransack( query_params.reject{ |key| key == "unidade_orcamentaria_do_exercicio_id_eq" } )
		else
			@q = Licitacao::Contrato.where.not(fim_da_vigencia: nil).where('unidade_orcamentaria_do_exercicio_id in (?)', @unidades_orcamentarias.pluck(:id)).order("id DESC").ransack(query_params)
		end

		@contratos = @q.result(distinct: true).where(unidade_orcamentaria_do_exercicio_id: current_usuario.unidades_orcamentarias.ids).paginate(page: params[:page], per_page: 10)	
	end

	# GET /controladoria/contratos/1
	def show
	end

	# PATCH/PUT /controladoria/contratos/1/encaminhar_para_comite_programacao_financeira
	def enviar_para_copfin
		if @contrato.enviar_para_copfin!
			redirect_to controladoria_contrato_url(@contrato), success: 'O projeto básico foi encaminhado para o COPFIN com sucesso.'
		else
			redirect_to controladoria_contrato_url(@contrato), alert: 'Não foi possível encaminhar o projeto. Por favor, confira se ele contém erros'
		end
	end

	# PATCH/PUT /controladoria/contratos/1/confirmar_contrato
	def enviar_para_licitacao
		begin
			if @contrato.enviado_para_licitacao!
				redirect_to controladoria_contrato_url(@contrato), success: 'O projeto básico foi confirmado.'
			else
				redirect_to controladoria_contrato_url(@contrato), alert: 'Não foi possível confirmar o projeto. Por favor, confira se ele contém erros.'
			end
		rescue ActiveRecord::RecordInvalid => e
			# Captura a exceção específica de validação
			flash[:alert] = "Não foi possível confirmar o projeto: #{e.message}"
			redirect_to controladoria_contrato_url(@contrato)
		end
	end
	

	# PATCH/PUT /controladoria/projetos/1/retornar_para_licitacao
	def retornar_para_licitacao
		if @contrato.aberto!
			redirect_to controladoria_contrato_url(@contrato), success: 'O  projeto básico foi enviado para a licitação para correção dos erros.'
		else
			redirect_to controladoria_contrato_url(@contrato), alert: 'Não foi possível encaminhar o  projeto básico. Por favor, confira se ele contém erros'
		end
	end

	def solicitacoes
		@unidades_por_usuario_ids = current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id)
		@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.where('loa_unidades_orcamentarias.id in (?)', @unidades_por_usuario_ids)
		@pessoas = Base::Pessoa.includes(:tipo_de_pessoa).fornecedores

		controladoria_solicitacoes_de_contrato_path
		contratos = contexto_atual.contratos.where('inicio_da_vigencia IS NULL OR fim_da_vigencia IS NULL').where('unidade_orcamentaria_do_exercicio_id in (?)', @unidades_orcamentarias.pluck(:id))

		@q = contratos.order(data_da_solicitacao: :desc).ransack(query_params)
		@contratos = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
	end

	def aditivos_pendentes
		@url_contratos = controladoria_contratos_path
		@pessoas = Base::Pessoa.includes(:tipo_de_pessoa).fornecedores
		@unidades_por_usuario_ids = current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id)
		@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.where('loa_unidades_orcamentarias.id in (?)', @unidades_por_usuario_ids)

		contratos = Licitacao::Contrato.where.not(fim_da_vigencia: nil).where('unidade_orcamentaria_do_exercicio_id in (?)', @unidades_orcamentarias.pluck(:id))
		status_enviado_para_controladoria = 2

		@q = contratos.left_joins(:aditivos).where("licitacao_aditivos.status =  ?" , status_enviado_para_controladoria).order("ID DESC").ransack(query_params)
		@contratos = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
	end

	private
	def set_contrato
		@contrato =  Licitacao::Contrato.find( params[:id] )
	end

end
