require 'rails_helper'
RSpec.describe ImportacaoTcm::Loa, type: :model do

	let(:dados_orcamento) {
		{
			"codigo_municipio" => "057",
			"exercicio_orcamento" => "201600",
			"nu_lei_orcamento" => "0000010435",
			"valor_total_fixado_orcamento" => "7272573519.0000",
			"numero_perc_sup_orcamento" => "25",
			"valor_total_supl_orcamento" => "1818143379.7500",
			"data_envio_loa" => "2015-10-14 00:00:00",
			"data_aprov_loa" => "2015-12-17 00:00:00",
			"data_public_loa" => "2015-12-28 00:00:00"
		}
	}

	let(:dados_orgaos) {
		[
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_orgao" => "01",
				"codigo_tipo_unidade" => "02",
				"nome_orgao" => "CAMARA MUNICIPAL DE FORTALEZA",
				"cgc_orgao" => "06621791000153"
			},
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_orgao" => "11",
				"codigo_tipo_unidade" => "01",
				"nome_orgao" => "GABINETE DO PREFEITO",
				"cgc_orgao" => "07954605000160"
			},
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_orgao" => "12",
				"codigo_tipo_unidade" => "04",
				"nome_orgao" => "GABINETE DO VICE-PREFEITO",
				"cgc_orgao" => "05329423000173"
			}
		]
	}

	let(:dados_gestores_unidades_gestoras) {
		[
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_unidade_gestora" => "99",
				"codigo_orgao" => "01",
				"codigo_unidade" => "101 ",
				"cpf_servidor" => "52498646353",
				"codigo_ingresso" => "E",
				"codigo_vinculo" => "L",
				"numero_expediente" => "00108",
				"data_inicio_gestao" => "2016-01-01 00:00:00",
				"data_referencia" => "201601",
				"nome_gestor" => "JOAO SALMITO FILHO",
				"data_fim_gestao" => "",
				"tipo_cargo" => "02",
				"status_ordenador_despesa" => ""
			},
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_unidade_gestora" => "53",
				"codigo_orgao" => "01",
				"codigo_unidade" => "901",
				"cpf_servidor" => "52498646353",
				"codigo_ingresso" => "E",
				"codigo_vinculo" => "L",
				"numero_expediente" => "00108",
				"data_inicio_gestao" => "2016-01-01 00:00:00",
				"data_referencia" => "201601",
				"nome_gestor" => "JOAO SALMITO FILHO",
				"data_fim_gestao" => "",
				"tipo_cargo" => "02",
				"status_ordenador_despesa" => ""
			},
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_unidade_gestora" => "11",
				"codigo_orgao" => "11",
				"codigo_unidade" => "101 ",
				"cpf_servidor" => "66095018315",
				"codigo_ingresso" => "N",
				"codigo_vinculo" => "E",
				"numero_expediente" => "9478303   ",
				"data_inicio_gestao" => "2016-01-04 00:00:00",
				"data_referencia" => "201601",
				"nome_gestor" => "FRANCISCO JOSE QUEIROZ MAIA FILHO  ",
				"data_fim_gestao" => "",
				"tipo_cargo" => "03",
				"status_ordenador_despesa" => ""
			}
		]
	}

	let(:dados_unidades_gestoras) {
		[
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_unidade_gestora" => "99",
				"data_referencia" => "201601",
				"nome_unidade_gestora" => "CAMARA MUNICIPAL DE FORTALEZA",
				"data_criacao" => "2016-01-01 00:00:00",
				"data_extincao" => "",
				"numero_lei_criacao" => "000000\/00"
			},
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_unidade_gestora" => "53",
				"data_referencia" => "201601",
				"nome_unidade_gestora" => "FUNDO ESPECIAL DA CAMARA MUNICIPAL DE FORTALEZA",
				"data_criacao" => "2016-01-01 00:00:00",
				"data_extincao" => "",
				"numero_lei_criacao" => "000000/00"
			},
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_unidade_gestora" => "11",
				"data_referencia" => "201601",
				"nome_unidade_gestora" => "GABINETE DO PREFEITO                                                            ",
				"data_criacao" => "2016-01-01 00:00:00",
				"data_extincao" => "",
				"numero_lei_criacao" => "0000/00"
			}
		]
	}

	let(:dados_unidades_orcamentarias) {
		[
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_orgao" => "01",
				"codigo_unidade" => "101",
				"codigo_tipo_unidade" => "02",
				"nome_unidade" => "CAMARA MUNICIPAL DE FORTALEZA",
				"tipo_administracao_unidade" => "I"
			},
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_orgao" => "12",
				"codigo_unidade" => "901",
				"codigo_tipo_unidade" => "04",
				"nome_unidade" => "FUNDO ESPECIAL DA CAMARA MUNICIPAL DE FORTALEZA",
				"tipo_administracao_unidade" => "I"
			},
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_orgao" => "11",
				"codigo_unidade" => "101",
				"codigo_tipo_unidade" => "01",
				"nome_unidade" => "GABINETE DO PREFEITO",
				"tipo_administracao_unidade" => "D"
			}
		]
	}

	let(:dados_programas_de_governo) {
		[
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_programa" => "0001",
				"nome_programa" => "GESTAO E MANUTENCAO"
			},
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_programa" => "0002",
				"nome_programa" => "ATUACAO LEGISLATIVA DA CAMARA MUNICIPAL"
			},
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_programa" => "0003",
				"nome_programa" => "DESENVOLVIMENTO DO DESPORTO COMUNITARIO E DE LAZER"
			}
		]
	}

	let(:dados_acoes_subacoes_com_subacao) {
		[
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_orgao" => "01",
				"codigo_unidade" => "101",
				"codigo_funcao" => "14",
				"codigo_subfuncao" => "241",
				"codigo_programa" => "0001",
				"codigo_projeto_atividade" => "1",
				"numero_projeto_atividade" => "032",
				"numero_subprojeto_atividade" => "0001",
				"codigo_tipo_orcamento" => "F",
				"nome_projeto_atividade" => "IMPLANTACAO DE ACADEMIAS PARA A TERCEIRA IDADE",
				"descricao_projeto_atividade" => "IMPLANTACAO DE ACADEMIAS PARA A TERCEIRA IDADE",
				"valor_total_fixado_projeto_atividade" => "62000.0000"
			},
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_orgao" => "11",
				"codigo_unidade" => "101",
				"codigo_funcao" => "14",
				"codigo_subfuncao" => "241",
				"codigo_programa" => "0002",
				"codigo_projeto_atividade" => "1",
				"numero_projeto_atividade" => "032",
				"numero_subprojeto_atividade" => "0002",
				"codigo_tipo_orcamento" => "F",
				"nome_projeto_atividade" => "IMPLANTACAO DE ACADEMIAS PARA A TERCEIRA IDADE",
				"descricao_projeto_atividade" => "IMPLANTACAO DE ACADEMIAS PARA A TERCEIRA IDADE",
				"valor_total_fixado_projeto_atividade" => "25000.0000"
			},
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_orgao" => "12",
				"codigo_unidade" => "901",
				"codigo_funcao" => "14",
				"codigo_subfuncao" => "241",
				"codigo_programa" => "0003",
				"codigo_projeto_atividade" => "1",
				"numero_projeto_atividade" => "032",
				"numero_subprojeto_atividade" => "0003",
				"codigo_tipo_orcamento" => "F",
				"nome_projeto_atividade" => "IMPLANTACAO DE ACADEMIAS PARA A TERCEIRA IDADE",
				"descricao_projeto_atividade" => "IMPLANTACAO DE ACADEMIAS PARA A TERCEIRA IDADE",
				"valor_total_fixado_projeto_atividade" => "25000.0000"
			}
		]
	}

	let(:dados_acoes_subacoes_sem_subacao) {
		[
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_orgao" => "01",
				"codigo_unidade" => "101",
				"codigo_funcao" => "14",
				"codigo_subfuncao" => "241",
				"codigo_programa" => "0001",
				"codigo_projeto_atividade" => "1",
				"numero_projeto_atividade" => "032",
				"numero_subprojeto_atividade" => "0000",
				"codigo_tipo_orcamento" => "F",
				"nome_projeto_atividade" => "IMPLANTACAO DE ACADEMIAS PARA A TERCEIRA IDADE",
				"descricao_projeto_atividade" => "IMPLANTACAO DE ACADEMIAS PARA A TERCEIRA IDADE",
				"valor_total_fixado_projeto_atividade" => "62000.0000"
			},
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_orgao" => "11",
				"codigo_unidade" => "101",
				"codigo_funcao" => "14",
				"codigo_subfuncao" => "241",
				"codigo_programa" => "0002",
				"codigo_projeto_atividade" => "1",
				"numero_projeto_atividade" => "032",
				"numero_subprojeto_atividade" => "0000",
				"codigo_tipo_orcamento" => "F",
				"nome_projeto_atividade" => "IMPLANTACAO DE ACADEMIAS PARA A TERCEIRA IDADE",
				"descricao_projeto_atividade" => "IMPLANTACAO DE ACADEMIAS PARA A TERCEIRA IDADE",
				"valor_total_fixado_projeto_atividade" => "25000.0000"
			},
			{
				"codigo_municipio" => "057",
				"exercicio_orcamento" => "201600",
				"codigo_orgao" => "12",
				"codigo_unidade" => "901",
				"codigo_funcao" => "14",
				"codigo_subfuncao" => "241",
				"codigo_programa" => "0003",
				"codigo_projeto_atividade" => "1",
				"numero_projeto_atividade" => "032",
				"numero_subprojeto_atividade" => "0000",
				"codigo_tipo_orcamento" => "F",
				"nome_projeto_atividade" => "IMPLANTACAO DE ACADEMIAS PARA A TERCEIRA IDADE",
				"descricao_projeto_atividade" => "IMPLANTACAO DE ACADEMIAS PARA A TERCEIRA IDADE",
				"valor_total_fixado_projeto_atividade" => "25000.0000"
			}
		]
	}

	let(:orcamento) {
		ImportacaoTcm::Loa.criar_orcamento(dados_orcamento)
	}

	let(:carrega_dependencias) {
		novo_orcamento = orcamento
		ImportacaoTcm::Loa.criar_orgaos(dados_orgaos, novo_orcamento)
		ImportacaoTcm::Loa.criar_unidades_gestoras(dados_unidades_gestoras, novo_orcamento)
		ImportacaoTcm::Loa.criar_unidades_orcamentarias(dados_unidades_orcamentarias, novo_orcamento, dados_gestores_unidades_gestoras)
		ImportacaoTcm::Loa.criar_programas_de_governo(dados_programas_de_governo, novo_orcamento)
	}

	describe "Importa os dados base de orçamento da API do TCM" do

		before(:each) {
			Ppa::Ppa.find_or_create_by!(FactoryBot.attributes_for(:ppa_fortaleza_2014))
		}

		xit ".criar_orcamento" do
			ImportacaoTcm::Loa.criar_orcamento(dados_orcamento)
			expect( Orcamento.find_by(
			exercicio: dados_orcamento['exercicio_orcamento'][0..3],
			numero_da_lei: dados_orcamento['nu_lei_orcamento'])
			).not_to be_nil
		end

		xit ".criar_orgaos" do
			ImportacaoTcm::Loa.criar_orgaos(dados_orgaos, orcamento)
			dados_orgaos.each do |dados_orgao|
				tipo_de_unidade_administrativa = Base::TipoDeUnidadeAdministrativa.find_by(codigo: dados_orgao['codigo_tipo_unidade'])

				expect( orcamento.orgaos.find_by(
					codigo: dados_orgao['codigo_orgao'],
					tipo_de_unidade_administrativa_id: tipo_de_unidade_administrativa.id,
					nome: dados_orgao['nome_orgao'],
					sigla: dados_orgao['codigo_orgao'],
					cnpj: dados_orgao['cgc_orgao'])
				).not_to be_nil
			end
		end

		xit ".criar_unidades_gestoras" do
			ImportacaoTcm::Loa.criar_unidades_gestoras(dados_unidades_gestoras, orcamento)
			dados_unidades_gestoras.each do |dados_unidade_gestora|
				expect(orcamento.unidades_gestoras.find_by(
					codigo: dados_unidade_gestora['codigo_unidade_gestora'],
					nome: dados_unidade_gestora['nome_unidade_gestora'].strip,
					data_de_cadastro: dados_unidade_gestora['data_criacao'][0..9],
					numero_da_lei_de_criacao: dados_unidade_gestora['numero_lei_criacao'])
				).not_to be_nil
			end
		end

		xit ".criar_unidades_orcamentarias" do
			ImportacaoTcm::Loa.criar_orgaos(dados_orgaos, orcamento)
			ImportacaoTcm::Loa.criar_unidades_gestoras(dados_unidades_gestoras, orcamento)
			ImportacaoTcm::Loa.criar_unidades_orcamentarias(dados_unidades_orcamentarias, orcamento, dados_gestores_unidades_gestoras)
			dados_unidades_orcamentarias.each do |dados_unidade_orcamentaria|
				orgao = orcamento.orgaos.find_by(codigo: dados_unidade_orcamentaria['codigo_orgao'])
				tipo_de_administracao = Base::TipoDeAdministracao.find_by(sigla: dados_unidade_orcamentaria['tipo_administracao_unidade'])
				tipo_de_unidade_administrativa = Base::TipoDeUnidadeAdministrativa.find_by(codigo: dados_unidade_orcamentaria['codigo_tipo_unidade'])

				expect(orgao.unidades_orcamentarias.find_by(
				codigo: dados_unidade_orcamentaria['codigo_unidade'],
				nome: dados_unidade_orcamentaria['nome_unidade'],
				sigla: dados_unidade_orcamentaria['codigo_unidade'],
				tipo_de_administracao_id: tipo_de_administracao.id,
				tipo_de_unidade_administrativa_id: tipo_de_unidade_administrativa.id)
				).not_to be_nil
			end
		end

		xit ".criar_programas_de_governo" do
			ImportacaoTcm::Loa.criar_programas_de_governo(dados_programas_de_governo, orcamento)
			dados_programas_de_governo.each do |dados_do_programa|
				expect(orcamento.programas_de_governo.find_by(
					codigo: dados_do_programa['codigo_programa'],
					nome: dados_do_programa['nome_programa'].strip)
				).not_to be_nil
			end
		end

		xit ".criar_acoes" do
			ImportacaoTcm::Loa.criar_programas_de_governo(dados_programas_de_governo, orcamento)
			ImportacaoTcm::Loa.criar_acoes(dados_acoes_subacoes_com_subacao, orcamento)
			dados_acoes_subacoes_com_subacao.each do |dados_acao|
				programa_de_governo = orcamento.programas_de_governo.find_by(codigo: dados_acao['codigo_programa'])
				natureza_da_acao = orcamento.naturezas_da_acao.find_by(codigo: dados_acao['codigo_projeto_atividade'])

				expect(programa_de_governo.acoes.find_by(
				codigo: dados_acao['numero_projeto_atividade'],
				nome: dados_acao['nome_projeto_atividade'].strip,
				descricao: dados_acao['descricao_projeto_atividade'].strip,
				natureza_da_acao_id: natureza_da_acao.id)
				).not_to be_nil
			end
		end

		context "quando o orçamento possui subações" do
			xit ".criar_subacoes" do
					carrega_dependencias
					ImportacaoTcm::Loa.criar_acoes(dados_acoes_subacoes_com_subacao, orcamento)
					ImportacaoTcm::Loa.criar_subacoes(dados_acoes_subacoes_com_subacao, orcamento)
					dados_acoes_subacoes_com_subacao.each do |dados_subacao|
						unidade_orcamentaria = orcamento.orgaos.find_by(codigo: dados_subacao['codigo_orgao']).unidades_orcamentarias.find_by(codigo: dados_subacao['codigo_unidade'])
						funcao = orcamento.funcoes.find_by(codigo: dados_subacao['codigo_funcao'])
						subfuncao = orcamento.subfuncoes.find_by(codigo: dados_subacao['codigo_subfuncao'])
						tipo_de_orcamento = orcamento.tipos_de_orcamento.find_by(codigo: dados_subacao['codigo_tipo_orcamento'])
						natureza_da_acao = orcamento.naturezas_da_acao.find_by(codigo: dados_subacao['codigo_projeto_atividade'])

						expect(orcamento.programas_de_governo.find_by(
						codigo: dados_subacao['codigo_programa']
						).acoes.find_by(
						natureza_da_acao_id: natureza_da_acao.id,
						codigo: dados_subacao['numero_projeto_atividade']
						).subacoes.find_by(
						codigo: dados_subacao['numero_subprojeto_atividade'],
						unidade_orcamentaria_id: unidade_orcamentaria.id,
						funcao_id: funcao.id,
						subfuncao_id: subfuncao.id,
						tipo_de_orcamento_id: tipo_de_orcamento.id)
						).not_to be_nil
				end
			end
		end

		context "quando o orçamento não possui subações" do
			xit ".criar_subacoes" do
				carrega_dependencias
				ImportacaoTcm::Loa.criar_acoes(dados_acoes_subacoes_sem_subacao, orcamento)
				ImportacaoTcm::Loa.criar_subacoes(dados_acoes_subacoes_sem_subacao, orcamento)
				dados_acoes_subacoes_sem_subacao.each do |dados_subacao|
					unidade_orcamentaria = orcamento.orgaos.find_by(codigo: dados_subacao['codigo_orgao']).unidades_orcamentarias.find_by(codigo: dados_subacao['codigo_unidade'])
					funcao = orcamento.funcoes.find_by(codigo: dados_subacao['codigo_funcao'])
					subfuncao = orcamento.subfuncoes.find_by(codigo: dados_subacao['codigo_subfuncao'])
					tipo_de_orcamento = orcamento.tipos_de_orcamento.find_by(codigo: dados_subacao['codigo_tipo_orcamento'])
					natureza_da_acao = orcamento.naturezas_da_acao.find_by(codigo: dados_subacao['codigo_projeto_atividade'])

					expect(orcamento.programas_de_governo.find_by(
					codigo: dados_subacao['codigo_programa']
					).acoes.find_by(
					natureza_da_acao_id: natureza_da_acao.id,
					codigo: dados_subacao['numero_projeto_atividade']
					).subacoes.find_by(
					codigo: dados_subacao['numero_subprojeto_atividade'],
					unidade_orcamentaria_id: unidade_orcamentaria.id,
					funcao_id: funcao.id,
					subfuncao_id: subfuncao.id,
					tipo_de_orcamento_id: tipo_de_orcamento.id)
					).not_to be_nil
				end
			end
		end
	end
end
