require 'rails_helper'


	RSpec.describe Licitacao::PessoaDoPedido, type: :model do
		cria_configuracao_default
		it{ is_expected.to belong_to(:pedido).required }
		it{ is_expected.to belong_to(:pessoa).required }
	    it{ is_expected.to have_many(:itens_do_pedido_por_pessoa).dependent(:destroy) }
	    it{ is_expected.to have_many(:itens_do_pedido).through(:itens_do_pedido_por_pessoa) }

	context 'valida presenca dos responsaveis' do
		describe 'adicionando apenas os fornecedores' do
			before(:each) do
				@pedido = Licitacao::Pedido.find_by( FactoryBot.attributes_for(:pedido).except(:categorias_do_pedido_attributes) ) || FactoryBot.create(:pedido)
			end

			[:nome_do_responsavel, :cpf_do_responsavel, :tipo_de_responsavel].each do |atributo|
				it '#{atributo} não precisa ser preenchido' do
					pessoa_do_pedido = Licitacao::PessoaDoPedido.new(pedido: @pedido, pessoa: FactoryBot.create(:pessoa_juridica))
					pessoa_do_pedido.validate

					expect(pessoa_do_pedido.errors[atributo]).to_not include "não pode ficar em branco"
				end
			end
		end

		describe 'preenchendo cotacao' do
			before(:each) do
				@pedido = Licitacao::Pedido.find_by( FactoryBot.attributes_for(:pedido).except(:categorias_do_pedido_attributes) ) || FactoryBot.create(:pedido)
				@item_do_pedido = FactoryBot.create :item_do_pedido, pedido: @pedido
			end

			[:nome_do_responsavel, :tipo_de_responsavel].each do |atributo|
				it '#{atributo} deve ser preenchido' do
					pessoa_do_pedido = Licitacao::PessoaDoPedido.create(pedido: @pedido, pessoa: FactoryBot.create(:pessoa_juridica))
					atributos_itens_do_pedido_por_pessoa =  {
						itens_do_pedido_por_pessoa_attributes: {
								'0': {
									item_do_pedido_id: @item_do_pedido.id,
									preco_de_cotacao: 10,
									marca: 'teste'
								}
						}
					}
					pessoa_do_pedido.update(atributos_itens_do_pedido_por_pessoa)

					expect(pessoa_do_pedido.errors[atributo]).to include "não pode ficar em branco"
				end
			end
		end
	end

	describe 'valida presença do anexo da cotação' do
		before(:each) do
			@pedido = Licitacao::Pedido.find_by( FactoryBot.attributes_for(:pedido).except(:categorias_do_pedido_attributes) ) || FactoryBot.create(:pedido)
			@item_do_pedido = FactoryBot.create :item_do_pedido, pedido: @pedido
		end

		it 'deve ser preenchido quando for cotação externa' do
			pessoa_do_pedido = Licitacao::PessoaDoPedido.create(pedido: @pedido, pessoa: FactoryBot.build(:pessoa_juridica), codigo_de_acesso: "1234" )
			atributos_itens_do_pedido_por_pessoa =  {
				itens_do_pedido_por_pessoa_attributes: {
						'0': {
							item_do_pedido_id: @item_do_pedido.id,
							preco_de_cotacao: 10,
							marca: 'teste'
						}
				}
			}
			pessoa_do_pedido.save
			pessoa_do_pedido.update(atributos_itens_do_pedido_por_pessoa)
			expect(pessoa_do_pedido.errors[:prazo_da_proposta]).to include("não pode ficar em branco")
			expect(pessoa_do_pedido.errors[:nome_do_responsavel]).to include("não pode ficar em branco")
			expect(pessoa_do_pedido.errors[:tipo_de_responsavel]).to include("não pode ficar em branco")
		end

		it 'pode ficar em branco na cotação interna' do
			pessoa_do_pedido = Licitacao::PessoaDoPedido.create(pedido: @pedido, pessoa: FactoryBot.create(:pessoa_juridica), codigo_de_acesso: nil)
			atributos_itens_do_pedido_por_pessoa =  {
				itens_do_pedido_por_pessoa_attributes: {
						'0': {
							item_do_pedido_id: @item_do_pedido.id,
							preco_de_cotacao: 10,
							marca: 'teste'
						}
				}
			}
			pessoa_do_pedido.update(atributos_itens_do_pedido_por_pessoa)

			expect(pessoa_do_pedido.errors[:anexo_cotacao]).to_not include ("não pode ficar em branco")
		end
	end

	describe '#update' do
		it 'validate_uniqueness_of item no escopo de pedido' do
			pedido = FactoryBot.create :pedido
			pessoa = Base::Pessoa.find_or_create_by(FactoryBot.attributes_for :pessoa_juridica)

			atributos_pessoas =  {
				pessoas_do_pedido_attributes: {
						'0': {
							pessoa_id: pessoa.id,
						},
						'1': {
							pessoa_id: pessoa.id,
						}
				}
			}

			pedido.update(atributos_pessoas)
			expect(pedido.errors[:pessoas_do_pedido]).to include("pessoa deve ser única dentro de um pedido")
		end
	end

	describe '#total_da_cotacao' do
		it 'retorna o total da cotação daquela empresa para um pedido' do
			pedido = FactoryBot.create :pedido
			item_do_pedido = FactoryBot.create :item_do_pedido, pedido_id: pedido.id
			pessoa_do_pedido = FactoryBot.create :pessoa_do_pedido, pedido_id: pedido.id
			outra_pessoa_do_pedido = FactoryBot.create :pessoa_do_pedido, pedido_id: pedido.id

			FactoryBot.create :licitacao_item_do_pedido_por_pessoa, item_do_pedido_id: item_do_pedido.id, pessoa_do_pedido_id: pessoa_do_pedido.id, preco_de_cotacao: 5.5

			FactoryBot.create :licitacao_item_do_pedido_por_pessoa, item_do_pedido_id: item_do_pedido.id, pessoa_do_pedido_id: outra_pessoa_do_pedido.id, preco_de_cotacao: 4.5
			pessoa_do_pedido.reload
			expect(pessoa_do_pedido.total_da_cotacao).to eq 45.0
		end
	end

	describe '#gerar_codigo_de_acesso' do
		before(:each) do
			@pessoa_do_pedido = FactoryBot.create :pessoa_do_pedido
			@pessoa_do_pedido.send(:gerar_codigo_de_acesso, Date.today)
			@pessoa_do_pedido.reload
		end
		it 'gera um codigo de acesso de mais de 16 dígitos' do
			expect(@pessoa_do_pedido.codigo_de_acesso.size).to be >= 16
		end
		it 'gera um codigo de acesso com validade igual a passada por parâmetro' do
			expect(@pessoa_do_pedido.validade_codigo_de_acesso).to eq Date.today
		end
	end

	context "formatacao de cpf" do
		it "que o cpf tenha o formato 000.000.000-00" do
			@pessoa_do_pedido = FactoryBot.create :pessoa_do_pedido
			@pessoa_do_pedido.cpf_do_responsavel = "55154913604"

			expect(@pessoa_do_pedido.cpf_do_responsavel.as_cpf).to eq "551.549.136-04"
		end
	end

	describe '#convidar' do
		before(:each) do
			@pessoa_do_pedido = FactoryBot.create :pessoa_do_pedido
		end
		context 'quando o fornecedor tem email' do
			# it 'envia email' do
			# 	expect{@pessoa_do_pedido.convidar}.to change { ActionMailer::Base.deliveries.count }.by(0)
			# 	expect(@pessoa_do_pedido.convidar).to eq ["teste@example.org", nil]
			# 	# contagem 0
			# end
			it 'gera novo código de acesso' do
				@pessoa_do_pedido.convidar
				codigo_de_acesso_antigo = @pessoa_do_pedido.codigo_de_acesso
				expect(codigo_de_acesso_antigo).not_to be_nil
				@pessoa_do_pedido.convidar
				expect(@pessoa_do_pedido.codigo_de_acesso).not_to be_nil
				expect(@pessoa_do_pedido.codigo_de_acesso).not_to eq codigo_de_acesso_antigo
			end
		end

		context 'quando o fornecedor não tem email' do
			it 'return nil' do
				pessoa = @pessoa_do_pedido.pessoa
				pessoa.update(email: nil)
				expect(@pessoa_do_pedido.convidar).to be_nil
			end
		end
	end

	describe '#confirmar_cotacao' do
		before(:each) do
			@pessoa_do_pedido = FactoryBot.create :pessoa_do_pedido
		end

		context 'quando o fornecedor não tem email' do
			it 'return nil' do
				pessoa = @pessoa_do_pedido.pessoa
				pessoa.update(email: nil)
				expect(@pessoa_do_pedido.confirmar_cotacao).to be_nil
			end
		end
	end

	describe "cotado?" do
		it "está cotado" do
			pessoa_do_pedido = FactoryBot.create :pessoa_do_pedido
			FactoryBot.create(:licitacao_item_do_pedido_por_pessoa, pessoa_do_pedido: pessoa_do_pedido)

			expect(pessoa_do_pedido.reload.cotado?).to be true
		end

		it "não está cotado" do
			pessoa_do_pedido = FactoryBot.create :pessoa_do_pedido

			expect(pessoa_do_pedido.cotado?).to be false
		end
	end

	it '#inicia_cotacao' do
		pedido = FactoryBot.create(:pedido)
		_item_do_pedido = FactoryBot.create :item_do_pedido, pedido: pedido
		pedido.pessoas_do_pedido.create(pessoa: FactoryBot.create(:pessoa_juridica))
		pedido.pessoas_do_pedido.first.inicia_cotacao

		expect(pedido.pessoas_do_pedido.first.itens_do_pedido_por_pessoa.length).to be > 0
	end

	describe 'validates_uniqueness_of :cpf_do_responsavel' do
		context 'quando cpf já existe em outra cotação' do
			context 'que é válida' do
				it 'retorna erro' do
					pedido = FactoryBot.create :pedido, status: :coleta_de_preco
					_pessoa1 = pedido.pessoas_do_pedido.create(pessoa: FactoryBot.create(:pessoa_juridica), cpf_do_responsavel: 45681491269)

					pessoa2 = pedido.pessoas_do_pedido.create(pessoa: FactoryBot.create(:pessoa_juridica, nome: "Empresa teste S/A"), cpf_do_responsavel: 45681491269)

					expect(pessoa2.errors[:cpf_do_responsavel]).to include "já existe cotação para o CPF informado"
				end
			end
			context 'que é inválida' do
				it 'valida objeto' do
					pedido = FactoryBot.create :pedido, status: :coleta_de_preco
					_pessoa1 = pedido.pessoas_do_pedido.create(pessoa: FactoryBot.create(:pessoa_juridica), valido: false, motivo: "para testar...")

					pessoa2 = pedido.pessoas_do_pedido.create(pessoa: FactoryBot.create(:pessoa_juridica, nome: "Empresa teste S/A"))

					expect(pessoa2).to be_valid
				end
			end
		end

		context 'quando cpf não existe em outra cotação' do
			it 'valida objeto' do
				pedido = FactoryBot.create :pedido, status: :coleta_de_preco
				_pessoa1 = pedido.pessoas_do_pedido.create(pessoa: FactoryBot.create(:pessoa_juridica))

				pessoa2 = pedido.pessoas_do_pedido.create(pessoa: FactoryBot.create(:pessoa_juridica, nome: "Empresa teste S/A"), cpf_do_responsavel: '46696659951')

				expect(pessoa2).to be_valid
			end
		end
	end

	describe "fornecedor_tem_menor_cotacao?" do
		it "retorna true" do
			pessoa_do_pedido = FactoryBot.create :pessoa_do_pedido
			pedido = Licitacao::Pedido.find_by( FactoryBot.attributes_for(:pedido).except(:categorias_do_pedido_attributes) ) || FactoryBot.create(:pedido)
			item_do_pedido = FactoryBot.create :item_do_pedido, pedido: pedido
			atributos_itens_do_pedido_por_pessoa =  {
				itens_do_pedido_por_pessoa_attributes: {
						'0': {
							item_do_pedido_id: item_do_pedido.id,
							preco_de_cotacao: 10,
							marca: 'teste'
						}
				}
			}
			pessoa_do_pedido.update(atributos_itens_do_pedido_por_pessoa)
			pessoa_do_pedido.reload
			expect(pessoa_do_pedido.fornecedor_tem_menor_cotacao?).to be_truthy
		end
		it "retorna false" do
			pessoa_do_pedido = FactoryBot.create :pessoa_do_pedido
			expect(pessoa_do_pedido.fornecedor_tem_menor_cotacao?).to be_falsey
		end
	end
end
