require 'rails_helper'

RSpec.describe Licitacao::DocumentoDoProcesso, type: :model do
	cria_configuracao_default

	it { is_expected.to belong_to(:processo).class_name("Licitacao::Processo") }
	it { is_expected.to belong_to(:usuario) }
	it { is_expected.to belong_to(:modelo_do_documento).class_name("Licitacao::ModeloDeDocumento") }
	it { is_expected.to belong_to(:agente_publico_municipal).class_name("Base::AgentePublicoMunicipal") }

	let(:atributos_validos_parecer) {
		FactoryBot.attributes_for( :licitacao_documento_do_processo, :parecer)
	}

	describe "validate_presence_of documento" do
		subject(:licitacao_documento_do_processo) {
			Licitacao::DocumentoDoProcesso.new (FactoryBot.attributes_for(:licitacao_documento_do_processo, texto: nil))
		}
		it{ is_expected.to validate_presence_of(:documento) }
	end

	describe "validate_presence_of agente_publico_municipal" do
		subject(:licitacao_documento_do_processo) {
			Licitacao::DocumentoDoProcesso.new (FactoryBot.attributes_for(:licitacao_documento_do_processo, :parecer))
		}
		it{ is_expected.to validate_presence_of(:agente_publico_municipal_id).on(:update) }
	end

	describe "validates_absence_of texto" do
		subject(:licitacao_documento_do_processo) {
			Licitacao::DocumentoDoProcesso.new (FactoryBot.attributes_for(:licitacao_documento_do_processo, documento_file_name: "teste.pdf", documento_content_type: "application/pdf", documento_file_size: 25093, documento_updated_at: Time.now))
		}
		it{ is_expected.to validate_absence_of(:texto) }
	end

	describe "validates_absence_of texto" do
		subject(:licitacao_documento_do_processo) {
			Licitacao::DocumentoDoProcesso.new (FactoryBot.attributes_for(:licitacao_documento_do_processo, tipo_de_documento: "personalizado", titulo_personalizado: "Mais um documento"))
		}
		it{ is_expected.to validate_presence_of(:titulo_personalizado) }
	end

	describe '#immutable' do
		it "não permite alterações no atributo tipo_de_documento" do
			documento_do_processo = FactoryBot.create( :licitacao_documento_do_processo )
			documento_do_processo.update(tipo_de_documento: 'edital')
			expect( documento_do_processo.errors[:tipo_de_documento] ).to include "não pode ser alterado"
		end
	end


	describe '#processo_ja_possui_um_termo_gerado' do
		it "não retorna erro se não tiver termo" do
			documento_do_processo = FactoryBot.create( :licitacao_documento_do_processo,tipo_de_documento: 'termo' )
			expect( documento_do_processo.errors[:tipo_de_documento] ).to_not include "Processo só pode possuir um termo de autuação"
		end

		it "não retorna erro se o segundo se não for termo" do
			documento_do_processo = FactoryBot.create( :licitacao_documento_do_processo,tipo_de_documento: 'termo' )
			documento_do_processo_novo = FactoryBot.build( :licitacao_documento_do_processo,tipo_de_documento: 'edital', projeto_id: documento_do_processo.projeto_id )
			documento_do_processo_novo.validate
			expect( documento_do_processo_novo.errors[:tipo_de_documento] ).to_not include "Processo só pode possuir um termo de autuação"
		end

		it "retorna erro se já tiver termo" do
			documento_do_processo = FactoryBot.create( :licitacao_documento_do_processo,tipo_de_documento: 'termo' )
			documento_do_processo_novo = FactoryBot.build( :licitacao_documento_do_processo,tipo_de_documento: 'termo', projeto_id: documento_do_processo.projeto_id )
			documento_do_processo_novo.validate
			expect( documento_do_processo_novo.errors[:tipo_de_documento] ).to include "Processo só pode possuir um termo de autuação"
		end
	end


	describe '#altera_titulo_do_documento' do
		it 'quando o título não é personalizado' do
			modelo_do_documento = FactoryBot.create(:licitacao_modelo_de_documento, tipo: "termo", titulo: "Termo de Autuação")
			documento_do_processo = FactoryBot.create( :licitacao_documento_do_processo, tipo_de_documento: "termo", modelo_do_documento: modelo_do_documento )

			expect(documento_do_processo.titulo_personalizado).to eq "Termo de Autuação"
		end

		it 'quando o título é personalizado' do
			documento_do_processo = FactoryBot.create( :licitacao_documento_do_processo, tipo_de_documento: "personalizado", titulo_personalizado: "Mais um documento" )

			expect(documento_do_processo.titulo_personalizado).to eq "Mais um documento"
		end
	end

	describe '#tipo_de_documento uniqueness' do
		context "não é possível salvar mais de um documento" do
			it "quando o tipo de documento for Minuta de Contrato" do
				documento_do_processo = FactoryBot.create( :licitacao_documento_do_processo, tipo_de_documento: "minuta_de_contrato" )
				outro_documento_do_processo = FactoryBot.build( :licitacao_documento_do_processo, projeto_id: documento_do_processo.projeto_id, tipo_de_documento: "minuta_de_contrato" )
				outro_documento_do_processo.save
				expect(outro_documento_do_processo.errors[:tipo_de_documento]).to include "já está em uso"
			end

			it "quando o tipo de documento for Minuta de Ata de Registro de Preço" do
				processo = FactoryBot.create :licitacao_processo, modalidade_de_licitacao: :pregao_presencial, registro_de_preco: true
				documento_do_processo = FactoryBot.create( :licitacao_documento_do_processo, tipo_de_documento: "minuta_de_ata_de_registro_de_preco", processo: processo)
				outro_documento_do_processo = FactoryBot.build( :licitacao_documento_do_processo, projeto_id: processo.id, tipo_de_documento: "minuta_de_ata_de_registro_de_preco" )
				outro_documento_do_processo.save
				expect(outro_documento_do_processo.errors[:tipo_de_documento]).to include "já está em uso"
			end
		end
	end

	describe 'pode_gerar_minuta_de_ata_de_registro_de_preco?' do
		context 'quando é pregão registro de preço' do
			it 'permite gerar minuta da ata' do
				processo = FactoryBot.create :licitacao_processo, modalidade_de_licitacao: :pregao_presencial, registro_de_preco: true
				documento_do_processo = FactoryBot.build( :licitacao_documento_do_processo, tipo_de_documento: "minuta_de_ata_de_registro_de_preco", processo: processo )
				documento_do_processo.validate
				expect(documento_do_processo).to be_valid
			end
		end
		context 'quando é pregão sem registro de preço' do
			it 'não permite gerar minuta da ata' do
				processo = FactoryBot.create :licitacao_processo, modalidade_de_licitacao: :pregao_presencial, registro_de_preco: false
				documento_do_processo = FactoryBot.build( :licitacao_documento_do_processo, tipo_de_documento: "minuta_de_ata_de_registro_de_preco", processo: processo )
				documento_do_processo.validate
				expect(documento_do_processo.errors[:tipo_de_documento]).to include "Não pode gerar ata nessa modalidade"
			end
		end
		context 'quando não é pregão' do
			it 'não permite gerar minuta da ata' do
				processo = FactoryBot.create :licitacao_processo, :convite
				documento_do_processo = FactoryBot.build( :licitacao_documento_do_processo, tipo_de_documento: "minuta_de_ata_de_registro_de_preco", processo: processo )
				documento_do_processo.validate
				expect(documento_do_processo.errors[:tipo_de_documento]).to include "Não pode gerar ata nessa modalidade"
			end
		end
	end

	# describe '#cria_mensagem_parecer_concluido' do
	# 	context 'ao concluir parecer' do
	# 		it 'envia mensagem para usuarios da Comissão de Licitação e Setor Administrativo' do
	# 			configuracao = Configuracao.last
	# 			configuracao.update_column(:permite_envio_de_email, false)
	#
	# 			documento_do_processo = Licitacao::DocumentoDoProcesso.create! atributos_validos_parecer
	# 			perfil_comissao = FactoryBot.create(:perfil_comissao_licitacao)
	# 			usuario_comissao = FactoryBot.create(:usuario_comum, perfil_id: perfil_comissao.id)
	# 			perfil_administrativo = FactoryBot.create(:perfil_setor_administrativo)
	# 			usuario_administrativo = FactoryBot.create(:usuario_comum, perfil_id: perfil_administrativo.id)
	# 			documento_do_processo.concluir_parecer
	#
	# 			expect(Comunicacao::MensagemDoUsuario.where(usuario_id: usuario_comissao.id).count).to eq 1
	#
	# 			expect(Comunicacao::MensagemDoUsuario.where(usuario_id: usuario_administrativo.id).count).to eq 1
	# 		end
	# 	end
	# end
end
