require 'rails_helper'

RSpec.describe Ppa::UnidadeOrcamentaria, type: :model do
	cria_tipos_de_despesa

	it{ is_expected.to belong_to :orgao }

	it{ is_expected.to have_many(:iniciativas).dependent(:restrict_with_exception)}
	it{ is_expected.to have_many(:convenios).dependent(:restrict_with_exception) }
	it{ is_expected.to have_many(:valores_do_convenio).through(:convenios) }
	it{ is_expected.to have_many(:loa_unidades_orcamentarias).class_name('Loa::UnidadeOrcamentaria').with_foreign_key(:ppa_unidade_orcamentaria_id) }

	it{ is_expected.to validate_presence_of :codigo}
	it{ is_expected.to validate_presence_of :nome}
	it{ is_expected.to validate_presence_of :sigla}
	it{ is_expected.to validate_presence_of :orgao_id}

	it{ is_expected.to validate_uniqueness_of( :nome ).scoped_to(:orgao_id) }
	it{ is_expected.to validate_uniqueness_of( :sigla ).scoped_to(:orgao_id) }
	it{ is_expected.to validate_uniqueness_of( :codigo ).scoped_to(:orgao_id) }

	describe "#codigo_com_zeros" do
		context "quando o código é menor que 10" do
			it "retorna o código com os zeros necessário à esquerda" do
				unidade_orcamentaria = Ppa::UnidadeOrcamentaria.new
				unidade_orcamentaria.codigo = 4
				expect( unidade_orcamentaria.codigo_com_zeros ).to eq '04'
			end
		end

		context "quando o código é maior que 10" do
			it "retorna o código sem zeros à esquerda" do
				unidade_orcamentaria = Ppa::UnidadeOrcamentaria.new
				unidade_orcamentaria.codigo = 105
				expect( unidade_orcamentaria.codigo_com_zeros ).to eq '105'
			end
		end
	end

	describe "#sugestao_de_codigo" do
		context "quando não há unidades orçamentárias cadastradas" do
			it "retorna 01" do
				unidade_orcamentaria = Ppa::UnidadeOrcamentaria.new( FactoryBot.attributes_for( :unidade_orcamentaria_administracao, codigo: '' ) )

				expect(unidade_orcamentaria.codigo).to eq 1
			end
		end

		context "quando há unidades orçamentárias cadastradas" do
			it "retorna o próximo código" do
				unidade_01 = FactoryBot.create( :unidade_orcamentaria_administracao, codigo: '01' )
				unidade_02 = Ppa::UnidadeOrcamentaria.new( FactoryBot.attributes_for( :unidade_orcamentaria_administracao, codigo: '' ) )

				expect(unidade_02.codigo).to eq 2
			end
		end

		context "quando há lacunas na sequência dos códigos" do
			it "retorna a primeira lacuna" do
				unidade_03 = FactoryBot.create( :unidade_orcamentaria_administracao, codigo: '03' )

				unidade_01 = Ppa::UnidadeOrcamentaria.new( FactoryBot.attributes_for( :unidade_orcamentaria_administracao, codigo: '' ) )

				expect(unidade_01.codigo).to eq 1
			end
		end
	end

	describe "#codigo_e_sigla" do
		it "retorna o código e a sigla no formato '01 - SIGLA'" do
			unidade_orcamentaria =  Ppa::UnidadeOrcamentaria.new( codigo: 4, sigla: 'IJF' )
			expect( unidade_orcamentaria.codigo_e_sigla ).to eq '04 - IJF'
		end
	end

	describe "#codigo_completo" do
		it "retorna o codigo do órgão + código da unidade orcamentária" do
			unidade_administracao = FactoryBot.build( :unidade_orcamentaria_administracao )
			unidade_administracao.orgao.codigo = '16'
			unidade_administracao.codigo = '80'
			expect( unidade_administracao.codigo_completo ).to eq( '1680' )
		end
	end

	describe 'convenios > valores do convênio' do
		before {
			valores_do_convenio_params = {}

			@unidade_orcamentaria = FactoryBot.create( :unidade_orcamentaria_administracao )
			@convenio = FactoryBot.build( :ppa_convenio, ppa_id: @unidade_orcamentaria.orgao.ppa_id )
			@convenio.save

			atributos =  {
				'valor': 80,
				"valores_do_convenio_attributes" => {}
			}

			valores_do_convenio = []

			@convenio.valores_do_convenio.each_with_index do |valor_do_convenio, index|

				valores_do_convenio[index] =  {
					"id" => valor_do_convenio.id,
					"valor" => "10"
				}

			end

			atributos['valores_do_convenio_attributes'] = valores_do_convenio
			@convenio.update( atributos )

		}

		context '#total_geral_de_previsao_de_convenios' do
			it 'retorna o total_geral_de_previsao_de_convenios' do
				expect(@unidade_orcamentaria.total_geral_de_previsao_de_convenios).to eq 80.0
			end
		end

		context '#total_previsao_de_convenios_correntes' do
			it 'retorna o total_previsao_de_convenios_correntes' do
				expect(@unidade_orcamentaria.total_previsao_de_convenios_correntes).to eq 40.0
			end
		end

		context '#total_previsao_de_convenios_de_capital' do
			it 'retorna o total_previsao_de_convenios_de_capital' do
				expect(@unidade_orcamentaria.total_previsao_de_convenios_de_capital).to eq 40.0
			end
		end

		context '#total_geral_de_previsao_de_convenios_por_exercicio' do
			it 'retorna o total_geral_de_previsao_de_convenios_por_exercicio' do
				expect(@unidade_orcamentaria.total_geral_de_previsao_de_convenios_por_exercicio( 2016 )).to eq 20.0
			end
		end

		context '#total_previsao_de_convenios_correntes_por_exercicio' do
			it 'retorna o total_previsao_de_convenios_correntes_por_exercicio' do
				expect(@unidade_orcamentaria.total_previsao_de_convenios_correntes_por_exercicio( 2016 )).to eq 10.0
			end
		end

		context '#total_previsao_de_convenios_de_capital_por_exercicio' do
			it 'retornar o total_previsao_de_convenios_de_capital_por_exercicio' do
				expect(@unidade_orcamentaria.total_previsao_de_convenios_de_capital_por_exercicio( 2016 )).to eq 10.0
			end
		end
	end

	describe 'ordenadores_de_despesas_ativos' do
		it 'quando existe ativo no período selecionado' do
			ordenador_de_despesa = FactoryBot.create(:ordenador_de_despesa, data_inicio_da_gestao: Date.today - 20.days, data_fim_de_gestao: Date.today + 20.days)

			expect(ordenador_de_despesa.unidade_orcamentaria.ordenadores_de_despesas_ativos(Date.today)).to include ordenador_de_despesa
		end

		it 'quando não existe ativo no período selecionado' do
			ordenador_de_despesa = FactoryBot.create(:ordenador_de_despesa, data_inicio_da_gestao: Date.today - 20.days, data_fim_de_gestao: Date.today + 20.days)

			expect(ordenador_de_despesa.unidade_orcamentaria.ordenadores_de_despesas_ativos(Date.today - 40.days)).to_not include ordenador_de_despesa
		end
	end
end
