module Licitacao
class AtasDeRegistroDePrecosController < ApplicationController
	include ControllerConcern

	before_action -> { verifica_modulo_na_sessao(["licitacao", "controladoria", "administrativo", "contabilidade"]) }, except: %i[edit update destroy]
	before_action -> { verifica_modulo_na_sessao(["licitacao", "contabilidade"]) }, only: %i[edit update destroy]
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: %i[editar_contratos importar_contratos editar_itens atualizar_itens editar_unidades_orcamentarias atualizar_unidades_orcamentarias confirmar_ata retornar_para_aberto envios_pncp]
	before_action :set_processo, only: %i[new create]
	before_action :set_ata_de_registro_de_precos, except: %i[index new create envios_pncp]
	before_action :disponibiliza_dependencias, only: %i[new edit]
	before_action -> { verifica_acesso_usuario(@ata_de_registro_de_precos) }, except: %i[index new create destroy envios_pncp]

	# GET /licitacao/atas_de_registro_de_precos
	def index
		@orcamentos = Orcamento.all.order(exercicio: :desc)

		orcamento = unless query_params["processo_orcamento_id_eq"].blank?
			Orcamento.find(query_params["processo_orcamento_id_eq"])
		else
			contexto_atual
		end
		@unidades_por_usuario_ids = current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id)
		@unidades_orcamentarias = orcamento.unidades_orcamentarias.where('loa_unidades_orcamentarias.id in (?)', @unidades_por_usuario_ids)
		@numeros_de_atas = Licitacao::AtaDeRegistroDePrecos.all

		if query_params["data_inicio_de_vigencia_eq"].blank? && query_params["data_final_de_vigencia_eq"].blank?
			atas_de_registros_de_preco = Licitacao::AtaDeRegistroDePrecos.includes([:unidades_orcamentarias_da_ata]).where("data_final_de_vigencia >= ?", "01/01/#{orcamento.exercicio}".to_date)
		else
			atas_de_registros_de_preco = Licitacao::AtaDeRegistroDePrecos.includes([:unidades_orcamentarias_da_ata]).all
		end

		@q = atas_de_registros_de_preco.joins(:unidades_orcamentarias_da_ata).where('licitacao_unidades_orcamentarias_da_ata.unidade_orcamentaria_id in (?)', @unidades_por_usuario_ids).order(data_inicio_de_vigencia: :desc).search(params[:q])

		@atas_de_registro_de_precos = @q.result(distinct: true).paginate(page: params[:page], per_page: 10)
	end

	# GET /licitacao/atas_de_registro_de_precos/1
	def show
		itens_da_ata_de_lotes_validos
		empenhos_diretos_da_ata
		@pessoas = Base::Pessoa.fornecedores.where(id: [@ata_de_registro_de_precos.ganhadores.pluck(:pessoa_id)])
		@unidades_orcamentarias = @ata_de_registro_de_precos.unidades_orcamentarias

		@q = @ata_de_registro_de_precos.contratos.search(params[:q])
		@contratos = @q.result(distinct: false).paginate(page: params[:page], per_page: 20)
	end

	# GET /licitacao/atas_de_registro_de_precos/new
	def new
		@ata_de_registro_de_precos = Licitacao::AtaDeRegistroDePrecos.new()
		@ata_de_registro_de_precos.numero = @processo.numero_do_processo
		@ata_de_registro_de_precos.processo = @processo
	end

	# POST /licitacao/atas_de_registro_de_precos
	def create
		@ata_de_registro_de_precos = Licitacao::AtaDeRegistroDePrecos.new(ata_de_registro_de_precos_params)
		@ata_de_registro_de_precos.projeto_id = @processo.id
		if @processo.pedido.verifica_acesso_do_usuario(current_usuario)
			if @ata_de_registro_de_precos.save
				redirect_to @ata_de_registro_de_precos, notice: 'Ata de registro de preços foi criada com sucesso.'
			else
				disponibiliza_dependencias
				render :new
			end
		else
			redirect_to @pedido, notice: 'Você não tem autorização para criar ata de registro'
		end
	end

	# GET /licitacao/atas_de_registro_de_precos/1/edit
	def edit
	end

	# PATCH/PUT /licitacao/atas_de_registro_de_precos/1
	def update
		if @ata_de_registro_de_precos.processo.pedido.verifica_acesso_do_usuario(current_usuario)
			if @ata_de_registro_de_precos.update( ata_de_registro_de_precos_params )
				redirect_to @ata_de_registro_de_precos, notice: 'Ata de registro de preços foi atualizada com sucesso.'
			else
				render :edit
			end
		else
			redirect_to @pedido, notice: 'Você não tem autorização para editar ata de registro'
		end
	end

	# DELETE /licitacao/atas_de_registro_de_precos/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@ata_de_registro_de_precos)
		redirect_to  licitacao_atas_de_registro_de_precos_url, mensagem
	end

	# GET /licitacao/atas_de_registro_de_precos/1/editar_contratos
	def editar_contratos
		disponibiliza_dependencias_unidades
		set_dependencias
		@importacao_tcm_contrato = Licitacao::ImportacaoTcmContrato.new()
	end

	# POST /licitacao/atas_de_registro_de_precos/1/importar_contratos
	def importar_contratos
		disponibiliza_dependencias_unidades
		set_dependencias
		@importacao_tcm_contrato = Licitacao::ImportacaoTcmContrato.new(importacao_contrato_params)
		if @importacao_tcm_contrato.save
			@importacao_tcm_contrato.contrato.ata_de_registro_de_preco_id = @ata_de_registro_de_precos.id
			@importacao_tcm_contrato.contrato.save(validate: false)
			redirect_to @ata_de_registro_de_precos, notice: 'Contrato foi importado com sucesso.'
		else
			redirect_to @ata_de_registro_de_precos, notice: 'Contrato não foi importado com sucesso.'
		end
	end

	# GET /licitacao/atas_de_registro_de_precos/1/unidades_orcamentarias
	def editar_unidades_orcamentarias
		return if bloqueia_usuario_com_base_em 'update'
		disponibiliza_dependencias_unidades

		if params[:todas] && params[:todas] == 'true'
			unidades_ja_adicionadas = @ata_de_registro_de_precos.unidades_orcamentarias_da_ata.map(&:unidade_orcamentaria)
			unidades_restantes = @unidades_orcamentarias - unidades_ja_adicionadas

			unidades_restantes.each do |unidade_orcamentaria|
				@ata_de_registro_de_precos.unidades_orcamentarias_da_ata.build(unidade_orcamentaria: unidade_orcamentaria)
			end
		end

		if @ata_de_registro_de_precos.unidades_orcamentarias_da_ata.empty?
			@ata_de_registro_de_precos.unidades_orcamentarias_da_ata.build
		end
	end

	# PATCH /licitacao/atas_de_registro_de_precos/1/unidades_orcamentarias
	def atualizar_unidades_orcamentarias
		return if bloqueia_usuario_com_base_em 'update'
		if @ata_de_registro_de_precos.update( unidades_orcamentarias_params )
			redirect_to @ata_de_registro_de_precos, notice: 'Unidades da ata atualizadas com sucesso.'
		else
			disponibiliza_dependencias_unidades
			render :editar_unidades_orcamentarias
		end
	end

	# GET /licitacao/atas_de_registro_de_precos/1/editar_itens
	def editar_itens
		return if bloqueia_usuario_com_base_em 'update'
		@itens_do_lote_por_unidades_da_ata = @ata_de_registro_de_precos.itens_das_unidades_selecionadas

		if params[:todos] && params[:todos] == 'true'
			itens_do_lote_ja_adicionados = @ata_de_registro_de_precos.itens_da_ata.map(&:item_do_lote)
			itens_do_lote_restantes = @itens_do_lote_por_unidades_da_ata - itens_do_lote_ja_adicionados

			itens_do_lote_restantes.each do |item_do_lote|
				@ata_de_registro_de_precos.itens_da_ata.build(item_do_lote: item_do_lote)
			end
		end

		@ata_de_registro_de_precos.itens_da_ata.build if @ata_de_registro_de_precos.itens_da_ata.empty?
	end

	# PATCH /licitacao/atas_de_registro_de_precos/1/atualizar_itens
	def atualizar_itens
		return if bloqueia_usuario_com_base_em 'update'
		if @ata_de_registro_de_precos.update(itens_da_ata_params)
			redirect_to @ata_de_registro_de_precos, notice: 'Itens da ata atualizados com sucesso.'
		else
			@itens_do_lote = @ata_de_registro_de_precos.processo.itens_do_lote.itens_dos_lotes_ativos
			render :editar_itens
		end
	end

	# PATCH /licitacao/atas_de_registro_de_precos/1/confirmar
	def confirmar_ata
		return if bloqueia_usuario_com_base_em 'update'

		if @ata_de_registro_de_precos.confirmar!
			redirect_to @ata_de_registro_de_precos, success: 'A ARP foi confirmada com sucesso.'
		else
			redirect_to @ata_de_registro_de_precos, alert: 'Não foi possível confirmar a ARP. Por favor, confira se ela contém erros'
		end
	end

	# PATCH /licitacao/atas_de_registro_de_precos/1/reabrir
	def retornar_para_aberto
		return if bloqueia_usuario_com_base_em 'update'

		if @ata_de_registro_de_precos.reabrir!
			redirect_to @ata_de_registro_de_precos, success: 'A ARP foi reaberta com sucesso.'
		else
			redirect_to @ata_de_registro_de_precos, alert: 'Não foi possível reabrir a ARP. Por favor, confira se ela contém erros'
		end
	end

	def editar_informacoes_do_pncp
	end

	def atualizar_informacoes_do_pncp
		@ata_de_registro_de_precos.assign_attributes(ata_de_registro_de_precos_params)
		if @ata_de_registro_de_precos.save(validate: false)
			@ata_de_registro_de_precos.update_column(:enviar_para_pncp, true)
			redirect_to @ata_de_registro_de_precos, notice: 'Informações do PNCP modificadas com sucesso'
		else
			render :editar_informacoes_do_pncp
		end
	end

	def envios_pncp
		index
	end

	private
	def disponibiliza_dependencias
		@modelos = Licitacao::ModeloDeDocumento.ata_de_registro_de_preco
	end

	def disponibiliza_dependencias_unidades
		if  @ata_de_registro_de_precos.processo.pedido.verifica_acesso_do_usuario_principal(current_usuario)
			@unidades_orcamentarias = @ata_de_registro_de_precos.processo.unidades_orcamentarias
		else
			@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)
		end
	end

	def set_ata_de_registro_de_precos
		@ata_de_registro_de_precos = AtaDeRegistroDePrecos.find( params[:id] )
	end

	def set_processo
		@processo = Licitacao::Processo.find( params[:processo_id] )
	end

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

	def set_dependencias
		@ata_de_registro_de_precos = AtaDeRegistroDePrecos.find( params[:id] )
		@processo = @ata_de_registro_de_precos.processo
	end

	# Permite apenas os parâmetros específicos
	def ata_de_registro_de_precos_params
		params.require(:licitacao_ata_de_registro_de_precos).permit(
			:numero, :data_final_de_vigencia, :data_inicio_de_vigencia, :projeto_id, :texto_da_ata, :modelo_de_documento_id, :compra_cnpj, :compra_ano, :compra_sequencial, :data_da_assinatura
		)
	end

	def unidades_orcamentarias_params
		begin
			params.require(:licitacao_ata_de_registro_de_precos).permit(unidades_orcamentarias_da_ata_attributes: [:id, :unidade_orcamentaria_id, :_destroy])
		rescue ActionController::ParameterMissing
			nil
		end
	end

	def itens_da_ata_params
		params.require(:licitacao_ata_de_registro_de_precos).permit(itens_da_ata_attributes: [:id, :item_do_lote_id, :_destroy])
	end

	def importacao_contrato_params
		params.require(:licitacao_importacao_tcm_contrato).permit(:ata_de_registro_de_precos, :projeto_id, :numero_do_contrato, :exercicio, :unidade_orcamentaria_id)
	end

	def itens_da_ata_de_lotes_validos
		@lotes_da_ata_de_registro_de_precos = @ata_de_registro_de_precos.processo.lotes.ativos.distinct
	end

	def empenhos_diretos_da_ata
		@empenhos = Contabilidade::Empenho.where(
			projeto_id: @ata_de_registro_de_precos.projeto_id
		).where(contrato_id: nil).paginate(page: params[:page], per_page: 10)
	end
end
end
