create or replace function fc_fonetica(text) returns text as 
$$
declare
	sString  text;
	sRetorno text;
	cLetra   char(1);
	cProximaLetra char(1);
	cLetraAnterior char(1);
	iConta   integer;
begin
	sString  := trim(upper($1));
	sRetorno := '';
	
	for iConta in 1..length(sString)
	loop
		cLetra         := substr(sString, iConta, 1);
		cProximaLetra  := substr(sString, iConta+1, 1);
		cLetraAnterior := substr(sString, iConta-1, 1);

		if cLetra = ' ' then
			sRetorno := sRetorno || '0';
			
		elsif cLetra = 'C' then
			
			if cProximaLetra = 'H' then
				sRetorno := sRetorno || 'X';

			elsif cProximaLetra in ('E', 'I') then
				sRetorno := sRetorno || 'SS';

			else
				sRetorno := sRetorno || 'K';

			end if;

		elsif cLetra in ('B', 'D', 'F', 'G', 'J', 'K', 'L', 'M', 'R', 'T', 'V', 'X') then
			sRetorno := sRetorno || cLetra;

		elsif cLetra = 'N' then
			
			if cProximaLetra in ('', '0') or cProximaLetra not in ('A', 'E', 'I', 'O', 'U') then
				sRetorno := sRetorno || 'M';
			else
				sRetorno := sRetorno || 'N';
			end if;
			
		elsif cLetra = 'P' then
			
			if cProximaLetra = 'H' then
				sRetorno := sRetorno || 'F';
			else
				sRetorno := sRetorno || 'P';
			end if;
		
		elsif cLetra = 'Q' then
			sRetorno := sRetorno || 'K';

		elsif cLetra = 'S' then
		
			if cProximaLetra = 'H' then 
				sRetorno := sRetorno || 'X';
			elsif cLetraAnterior = 'S' or cProximaLetra = 'S' or cProximaLetra not in ('A', 'E', 'I', 'O', 'U') then
				sRetorno := sRetorno || 'S';
			elsif iConta = 0 or cProximaLetra not in ('A', 'E', 'I', 'O', 'U') then
				sRetorno := sRetorno || 'SS';
			else
				sRetorno := sRetorno || 'Z';
			end if;
			
		elsif cLetra = 'W' then
			
			if cProximaLetra in ('A', 'E', 'I', 'O', 'U') then
				sRetorno := sRetorno || 'V';
			end if;

		elsif cLetra = 'Z' then

			if cProximaLetra = 'Z' then
				sRetorno := sRetorno || 'Z';
			elsif cLetraAnterior = 'Z' then
				sRetorno := sRetorno || '';
			elsif cProximaLetra not in ('A', 'E', 'I', 'O', 'U') then
				sRetorno := sRetorno || 'S';
			elsif cProximaLetra = '' then
				sRetorno := sRetorno || 's';
			else
				sRetorno := sRetorno || 'Z';
			end if;

		end if;

	end loop;

	return sRetorno;
end;
$$ language 'plpgsql' immutable;


create or replace function fc_primeironome(text) returns text as
$$
	select split_part($1, ' ', 1);
$$
language 'sql' immutable;

create or replace function fc_ultimonome(text) returns text as
$$
	select split_part($1, ' ', array_upper(string_to_array($1, ' '), 1));
$$ language 'sql' immutable;

create or replace function fc_foneticaprimeironome(text) returns text as
$$
	select fc_fonetica(fc_primeironome($1));
$$
language 'sql' immutable;
