require 'rails_helper'

RSpec.describe Loa::Orgao, type: :model do
	it{ is_expected.to belong_to(:orcamento).required }
	it{ is_expected.to belong_to( :tipo_de_unidade_administrativa).class_name('Base::TipoDeUnidadeAdministrativa').required }

	it{ is_expected.to have_many(:unidades_orcamentarias).dependent(:restrict_with_exception) }
	it { is_expected.to validate_length_of(:codigo).is_at_most(3) }
	it { is_expected.to validate_length_of(:nome).is_at_most(80) }
	it { is_expected.to validate_length_of(:sigla).is_at_most(10) }
	it { is_expected.to validate_length_of(:endereco).is_at_most(255) }
	it { is_expected.to validate_length_of(:email).is_at_most(50) }

	subject { FactoryBot.build(:loa_prefeitura, :orcamento_2016) }
	it { is_expected.to allow_value("8:00").for( :horario_inicio_funcionamento ) }
	it { is_expected.to allow_value("17:00").for( :horario_fim_funcionamento ) }
	it { is_expected.not_to allow_value("24:00").for( :horario_fim_funcionamento ).with_message('não é válido') }

	it { is_expected.to validate_length_of(:cnpj).is_equal_to(14) }
	it { is_expected.to validate_length_of(:cep).is_equal_to(8) }
	it { is_expected.to validate_length_of(:telefone).is_at_least(10) }
	it { is_expected.to validate_length_of(:fax).is_at_least(10) }

	[:orcamento_id, :codigo, :tipo_de_unidade_administrativa_id, :nome, :sigla,
		:cnpj, :endereco, :cep, :telefone, :email, :horario_inicio_funcionamento,
		:horario_fim_funcionamento, :status_do_orcamento].each do |atributo|
		it{ is_expected.to validate_presence_of atributo }
	end

	[:codigo, :nome, :sigla].each do |atributo|
		it{ is_expected.to validate_uniqueness_of( atributo ).scoped_to(:orcamento_id) }
	end

	describe '#horario_de_fim_maior_que_o_de_inicio' do
		before :each do
			@orgao = FactoryBot.build(:loa_secretaria_de_saude, :orcamento_2016)
		end

		context 'ao cadastrar horario de fim menor que o de inicio' do
			context 'quando a hora está errada' do
				it 'retorna mensagem de erro' do
				@orgao.horario_inicio_funcionamento = "16:00"
				@orgao.horario_fim_funcionamento = "08:00"
				@orgao.save
				expect( @orgao.errors[:horario_fim_funcionamento] ).to include "horário de fim não pode ser menor que o de início"
				end
			end

			context 'quando a hora está certa mas os minutos estão maiores' do
				it 'retorna mensagem de erro' do
					@orgao.horario_inicio_funcionamento = "07:01"
					@orgao.horario_fim_funcionamento = "08:00"
					@orgao.save
					expect( @orgao ).to be_persisted
				end
			end
		end

		context 'ao cadastrar horario de fim igual que o de inicio' do
			it 'salva o orgão' do
				@orgao.horario_inicio_funcionamento = "08:00"
				@orgao.horario_fim_funcionamento = "08:00"
				@orgao.save
				expect( @orgao ).to be_persisted
			end
		end

		context 'ao cadastrar horario de fim maior que o de inicio' do
			it 'salva o orgão' do
				@orgao.horario_inicio_funcionamento = "08:00"
				@orgao.horario_fim_funcionamento = "16:00"
				@orgao.save
				expect( @orgao ).to be_persisted
			end
		end
	end

	describe '#ambos_os_horarios_devem_ser_preenchidos' do
		before :each do
			@orgao = FactoryBot.build(:loa_secretaria_de_saude, :orcamento_2016)
		end

		context 'ao cadastrar somente o início os horários' do
			it "retorna erro no campo de fim de funcionamento" do
				@orgao.horario_inicio_funcionamento = "08:00"
				@orgao.horario_fim_funcionamento = nil
				@orgao.save
				expect( @orgao.errors[:horario_fim_funcionamento] ).to include "tanto o início quanto o fim devem ser especificados"
			end
		end

		context 'ao cadastrar somente o fim dos horários' do
			it "retorna erro no campo de inicio de funcionamento" do
				@orgao.horario_inicio_funcionamento = nil
				@orgao.horario_fim_funcionamento = "16:00"
				@orgao.save
				expect( @orgao.errors[:horario_inicio_funcionamento] ).to include "tanto o início quanto o fim devem ser especificados"
			end
		end

		context 'ao cadastrar ambos os horários' do
			it "salva o orgão" do
				@orgao.horario_inicio_funcionamento = "08:00"
				@orgao.horario_fim_funcionamento = "16:00"
				@orgao.save
				expect( @orgao ).to be_persisted
			end
		end
	end

	describe "#upcase_sigla" do
		it "salva sigla com letras maiusculas" do
			orgao = FactoryBot.build(:loa_secretaria_de_saude, :orcamento_2016)
			orgao.sigla = 'aaaa'
			orgao.save

			expect(Loa::Orgao.last.sigla).to eq('AAAA')
		end
	end

	describe 'validação do cnpj' do
		it "que o cnpj seja valido" do
			orgao = FactoryBot.build(:loa_secretaria_de_saude, :orcamento_2016)
			orgao.save
			expect( orgao ).to be_persisted
		end

		it "que o cnpj seja valido" do
			orgao = FactoryBot.build(:loa_secretaria_de_saude, :orcamento_2016, cnpj: '999999999999')
			orgao.validate
			expect( orgao.errors[:cnpj] ).to include "não é válido"
		end
	end

	describe "#sugestao_de_codigo" do
		context "quando não há orgãos cadastrados" do
			it "retorna 01" do
				orgao = Loa::Orgao.new( FactoryBot.attributes_for(:loa_secretaria_de_saude, :orcamento_2016, codigo: '') )

				expect(orgao.codigo).to eq '01'
			end
		end

		context "quando há orgãos cadastrados" do
			it "retorna o próximo código" do
				orgao_01 = Loa::Orgao.new( FactoryBot.attributes_for(:loa_secretaria_de_saude, :orcamento_2016, codigo: '01') )
				orgao_01.save

				orgao_02 = Loa::Orgao.new( FactoryBot.attributes_for(:loa_desenvolvimento_economico, :orcamento_2016, codigo: '') )

				expect(orgao_02.codigo).to eq '02'
			end
		end

		context "quando há lacunas na sequência dos códigos" do
			it "retorna a primeira lacuna" do
				FactoryBot.create(:loa_secretaria_de_saude, :orcamento_2016, codigo: '01')
				FactoryBot.create(:loa_secretaria_da_educacao, :orcamento_2016, codigo: '03')
				FactoryBot.create(:loa_desenvolvimento_economico, :orcamento_2016, codigo: '05')

				orgao = Loa::Orgao.new( FactoryBot.attributes_for(:loa_desenvolvimento_economico, :orcamento_2016, codigo: '') )

				expect(orgao.codigo).to eq '02'
			end
		end
	end

	describe '#uniqueness_orgao_reserva_de_contingencia' do
		it 'retorna mensagem de erro no cadastro, casa já haja um orgão do tipo reserva de contingência' do
			tipo_de_unidade_administrativa = Base::TipoDeUnidadeAdministrativa.find_or_create_by!( FactoryBot.attributes_for( :unidade_reserva_de_contingencia, :orcamento_2016).except!(:poder_associado) )

			orgao_reserva_de_contingencia = FactoryBot.build( :loa_secretaria_de_saude, :orcamento_2016 )
			orgao_reserva_de_contingencia.tipo_de_unidade_administrativa_id = tipo_de_unidade_administrativa.id
			orgao_reserva_de_contingencia.save

			orgao_reserva_de_contingencia_com_erro = FactoryBot.build( :loa_secretaria_da_educacao, :orcamento_2016 )
			orgao_reserva_de_contingencia_com_erro.tipo_de_unidade_administrativa_id = tipo_de_unidade_administrativa.id
			orgao_reserva_de_contingencia_com_erro.save

			expect(orgao_reserva_de_contingencia_com_erro.errors[:tipo_de_unidade_administrativa_id]).to include( 'já existe um orgão de reserva de contingência' )
		end
	end

	describe 'to_sim' do
		before(:each) do
			FactoryBot.create(:configuracao)
		end
		# testar sempre validando se o ultimo campo foi preenchido
		it 'retorna string formatada para envio ao SIM' do
			orgao = FactoryBot.build(:loa_secretaria_de_saude, :orcamento_2016)
			expect( orgao.to_sim ).to eq '"103","099","201600","04","91","Secretaria de Financas","03515732000102","Rua General Bezerril, 730 - Centro, Fortaleza - CE","60055100","08531051203","08531051299","sefin@ce.gov.br"'
		end
	end

	it 'importar_dados_do_orgao' do
		orgao_ppa = FactoryBot.create( :orgao_secretaria_da_fazenda, :ppa_2014 )
		orgao = FactoryBot.create(:loa_secretaria_de_saude, :orcamento_2016, orgao_id: orgao_ppa.id )
		orgao.importar_dados_do_orgao

		expect(orgao.attributes).to include("nome" => orgao_ppa.nome, "codigo" => orgao_ppa.codigo_com_zeros)
	end
end
