do $$
declare
vinculoAExcluir record;
declare qtdPessoasParaODiscente numeric;
declare pessoaResponsavel record;
begin
	
	alter table medio.discente_medio drop constraint discente_infantil_id_responsavel_ufrn_fkey;
	alter table medio.discente_medio drop constraint discente_infantil_id_outro_responsavel_fkey;
	
	for vinculoAExcluir in
		(
		select d.id_discente,d.matricula,p.id_pessoa, p.nome from 
		medio.discente_medio dm 
		--inner join medio.matricula_discente_serie mds on dm.id_discente = mds.id_discente
		inner join public.discente d on dm.id_discente=d.id_discente
		inner join comum.pessoa p on d.id_pessoa = p.id_pessoa
		where dm.id_discente not in
			(
				--matriculas associadas a turmas ativas de 2019
				select mds.id_discente from 
				medio.matricula_discente_serie mds inner join medio.turma_serie ts on mds.id_turma_serie=ts.id_turma_serie
				inner join medio.situacao_matricula_serie sms on mds.id_situacao_matricula_serie=sms.id_situacao_matricula_serie
				where ts.id_turma_serie in
					(
						--turmas ativas de 2019
						select distinct ts.id_turma_serie 
						from 
						medio.turma_serie ts 
						inner join medio.turma_serie_ano tsa on ts.id_turma_serie=tsa.id_turma_serie
						inner join ensino.turma t on tsa.id_turma=t.id_turma 
						inner join ensino.situacao_turma st on t.id_situacao_turma=st.id_situacao_turma
						where ts.ativo=true and tsa.ativo=true and st.descricao in ('ABERTA', 'A DEFINIR DOCENTE','CONSOLIDADA')
						and ts.ano=2019	
					  )
				and sms.descricao in ('MATRICULADO', 'APROVADO', 'TRANCADO','APROVADO EM DEPENDÊNCIA')
			)
			and trim(p.nome) in
			( 
				select nome from
					(
					select
					trim(p.nome) as nome,
					count(*) as qtd
						from
							comum.pessoa p
						inner join public.discente d on
							p.id_pessoa = d.id_pessoa
						group by
							trim(p.nome)
						having
							count(*)>1
						order by
							trim(p.nome) asc
							) as nome
			)
				
		order by p.nome asc
	)
	loop
	raise notice 'Analisando % % %', vinculoAExcluir.id_discente, vinculoAExcluir.matricula, vinculoAExcluir.nome;
	--deleta medio.matricula_componente_serie
	delete from  medio.matricula_componente_serie where id_matricula_discente_serie in 
			(select id_matricula_discente_serie from medio.matricula_discente_serie mds where mds.id_discente=vinculoAExcluir.id_discente);
		raise notice '   apagados registros de medio.matricula_componente_serie';
	--deleta ensino.matricula_turma
	delete from ensino.matricula_componente where id_discente=vinculoAExcluir.id_discente;
		raise notice '   apagados registros de ensino.matricula_componente';
	--deleta medio.matricula_discente_serie
	delete from medio.matricula_discente_serie where  id_discente = vinculoAExcluir.id_discente;
		raise notice '   apagados registros de medio.matricula_discente_serie';
	--talvez deletar registro_emissao_historico
	delete from medio.registro_emissao_historico where id_discente= vinculoAExcluir.id_discente;
		raise notice '   apagados registros de medio.registro_emissao_historico';
		raise notice '   responsáveis:';
	--apagando infantil.responsavel_discente
	for pessoaResponsavel in (select rd.id_responsavel_discente,rd.id_pessoa, rd.id_discente from infantil.responsavel_discente rd where rd.id_discente=vinculoAExcluir.id_discente)
		loop
			-- a pessoa associada ao responsavel está associada a outro responsavel de um vinculo distinto?
			-- caso positivo, não apaga
			if (select count(*) from comum.pessoa p 
				inner join infantil.responsavel_discente rd on p.id_pessoa = rd.id_pessoa 
				where rd.id_discente != vinculoAExcluir.id_discente
				and rd.id_pessoa= pessoaResponsavel.id_pessoa)=0 
				then
					delete from infantil.responsavel_discente where id_responsavel_discente=pessoaResponsavel.id_responsavel_discente;
					raise notice '      excluído responsavel %', pessoaResponsavel.id_responsavel_discente;
					delete from comum.alteracao_pessoa where id_pessoa=pessoaResponsavel.id_pessoa;
					delete from comum.pessoa where id_pessoa=pessoaResponsavel.id_pessoa;
					raise notice '      excluída pessoa %', pessoaResponsavel.id_pessoa;
				else 
					delete from infantil.responsavel_discente where id_responsavel_discente=pessoaResponsavel.id_responsavel_discente;
					raise notice '      excluído responsavel %', pessoaResponsavel.id_responsavel_discente;
					raise notice '      não foi excluída a pessoa porque tinha associação com outro responsável de outro vínculo.';
				
				end if;
		end loop;
	
	--deleta medio.discente_medio
	delete from medio.discente_medio where id_discente = vinculoAExcluir.id_discente;
		raise notice '   apagados registros de medio.discente_medio';
	--deleta possíveis observações associadas ao discente
	raise notice '   apagando observações associadas ao vínculo duplicado';
	delete from ensino.observacao_discente where id_discente=vinculoAExcluir.id_discente;
	--deleta public.discente

	delete from public.discente where id_discente = vinculoAExcluir.id_discente;
		raise notice '   apagados registros de public.discente';
	--deleta comum.pessoa se não houver associação dessa pessoa com outro vínculo
	if (select count(*) from public.discente where id_pessoa=vinculoAExcluir.id_pessoa)>0 then
		raise notice '   não foi possível apagar a pessoa porque havia outro vínculo associado, aguardando próximas iterações para averiguar estes vínculos.';
	else
		raise notice '   apagando registros de comum.alteracao_pessoa';
		delete from comum.alteracao_pessoa where id_pessoa=vinculoAExcluir.id_pessoa;
		delete from comum.pessoa where id_pessoa=vinculoAExcluir.id_pessoa;
		raise notice '   Registro de pessoa duplicado de % excluído.', vinculoAExcluir.nome;
	end if;

	end loop;

ALTER TABLE medio.discente_medio ADD CONSTRAINT discente_infantil_id_responsavel_ufrn_fkey FOREIGN KEY (id_responsavel_ufrn) REFERENCES infantil.responsavel_discente(id_responsavel_discente);
ALTER TABLE medio.discente_medio ADD CONSTRAINT discente_infantil_id_outro_responsavel_fkey FOREIGN KEY (id_outro_responsavel) REFERENCES infantil.responsavel_discente(id_responsavel_discente);

end;
$$ language plpgsql;
