require 'rails_helper'
include ActiveSupport::Testing::TimeHelpers

RSpec.describe Contabilidade::EstornoDePagamento, type: :model do
	cria_configuracao_default
	# it_behaves_like "reverte eventos contábeis", "Estornar", Contabilidade::EstornoDePagamento, :pagamento_de_pessoal, :estorno_de_pagamento

	it{ is_expected.to belong_to( :pagamento ) }
	it{ is_expected.to belong_to( :usuario ) }

	[:justificativa, :pagamento_id, :data_do_estorno].each do |atributo|
		it{ is_expected.to validate_presence_of atributo }
	end

	it { is_expected.to allow_value('01/01/2016').for(:data_do_estorno) }
	it { is_expected.to_not allow_value('').for(:data_do_estorno) }
	it { is_expected.to_not allow_value('00/').for(:data_do_estorno) }

	let(:usuario) { FactoryBot.create(:usuario_comum) }

	it 'inclui a data do estorno como o dia da criação ao salvar o estorno' do
			@pagamento = FactoryBot.create(:pagamento_de_pessoal)
			@estorno = FactoryBot.build(:estorno_de_pagamento, usuario_id: usuario.id, pagamento_id: @pagamento.id)
			expect( @estorno.data_do_estorno ).to eq Date.today
	end

	describe "#estorna_o_pagamento" do
		it 'atualiza o campo estornada do pagamento' do
			pagamento = Contabilidade::Pagamento.find_or_create_by!( FactoryBot.attributes_for(:pagamento_de_pessoal) )
			estorno_de_pagamento = Contabilidade::EstornoDePagamento.create(pagamento: pagamento, justificativa: "...", usuario_id: usuario.id)
			expect(pagamento.reload.estornado?).to eq true
		end
	end

	describe "#retira_valor_pago_da_liquidacao" do
		it "atualiza valor pago da liquidação" do
			pagamento = Contabilidade::Pagamento.find_or_create_by!( FactoryBot.attributes_for(:pagamento_de_pessoal, valor: 9.99) )
			Contabilidade::EstornoDePagamento.create(pagamento: pagamento, justificativa: "...", usuario_id: usuario.id)
			expect(pagamento.liquidacao.valor_pago).to eq 0.00
		end

		it "atualiza saldo da liquidação" do
			liquidacao = Contabilidade::Liquidacao.find_or_create_by!( FactoryBot.attributes_for(:liquidacao_001, valor: 9.99) )
			pagamento = Contabilidade::Pagamento.find_or_create_by!( FactoryBot.attributes_for(:pagamento_de_pessoal, valor: 9.99, liquidacao: liquidacao ) )
			Contabilidade::EstornoDePagamento.create(pagamento: pagamento, justificativa: "...", usuario_id: usuario.id)
			expect(liquidacao.saldo).to eq 9.99
		end
	end

	describe '#impedir_se_for_prepagamento' do
		it 'retorna mensagem de erro' do
			pagamento = FactoryBot.create :pagamento_de_pessoal, prepagamento: true
			estorno_de_pagamento = FactoryBot.build :estorno_de_pagamento, pagamento_id: pagamento.id
			estorno_de_pagamento.save

			expect(estorno_de_pagamento.errors[:justificativa]).to include 'não é possível realizar o estorno deste pagamento, pois se trata de um prepagamento'
		end
	end

	describe '#valor' do
		context 'quando tem estorno' do
			it 'retorna valor' do
				pagamento = FactoryBot.create :pagamento_de_pessoal
				Contabilidade::EstornoDePagamento.create(pagamento: pagamento, justificativa: "...", usuario_id: usuario.id)
				expect(pagamento.estorno_de_pagamento.valor.to_f).to eq 9.99
			end
		end
	end

	context 'Data do estorno superior a data de abertura da conta' do
		before(:each) do
			@pagamento = FactoryBot.create(:pagamento_de_pessoal)
			@pagamento.reload
			@estorno = FactoryBot.build(:estorno_de_pagamento, usuario_id: usuario.id,
			pagamento_id: @pagamento.id,
			data_do_estorno: Date.today)
		end
		it 'Quando data do estorno é superior ou igual a data de abertura' do
			@pagamento.contas_bancarias_por_pagamento.last.conta_bancaria.update_attribute(:data_de_abertura, Date.today)
			@estorno.validate
			expect(@estorno.errors[:data_do_estorno]).to_not include "Inferior a Data de Abertura das Seguintes Contas: #{@pagamento.contas_bancarias_por_pagamento.last.conta_bancaria.to_s}"
		end
		it 'Quando data do estorno é inferior a data de abertura' do
			@pagamento.contas_bancarias_por_pagamento.last.conta_bancaria.update_attribute(:data_de_abertura, Date.today + 1.day)
			@estorno.validate
			expect(@estorno.errors[:data_do_estorno]).to include "Inferior a Data de Abertura das Seguintes Contas: #{@pagamento.contas_bancarias_por_pagamento.last.conta_bancaria.to_s}"
		end
	end
end
