CREATE OR REPLACE FUNCTION preparetopographicindexsearch(content character varying, complement character varying) RETURNS character varying
    LANGUAGE plpgsql
    AS $_$
DECLARE
    result varchar;
    resultAux varchar;
    number integer;
    content_v varchar;

    count int;
    new_content varchar;
    letter char;
BEGIN
    --tira acentos e converte pra minusculas e adiciona | como terminador de string.
    result := lower ( unaccent ( trim( content ) ) );

    -- Separa somente números
    new_content := '';
    count := 0;
    number := 0;

    WHILE (count < char_length(content))
    LOOP
        -- Obtém caractere.
        letter := substring(content, count+1, 1);

        -- Testa se caractere é numérico.
        IF letter ~ '^[0-9]$' AND char_length(new_content) < 9
        THEN
            new_content := new_content || letter;
        ELSE
            IF char_length(new_content) > 0
            THEN
                 number := new_content::integer;
                EXIT;
            END IF;
        END IF;

        count = count + 1;
    END LOOP;

    content_v := substring(content from position(number::text in content));

    /**
        Exemplo de precedência que deve ser levado em conta, vide #12268 :
        658.012.4+657 -> + vem primeiro
        658.012.4/.5 -> / vem segundo
        658.012.4 -> Numeros inteiros em terceiro
        658.012.4:266 -> : depois dos números inteiros
    */
    result := translate( result, '+/|:=("*-.\'0123456789', 'ABCDEFGHIJKMNOPQRSTUV');
    --tratamento da excessão (0 => EI deve vir após (1/9 => EJ/9
    --result := replace( result, 'FJ','FT');

    --tratamento da exceção "(=" vai depois de ([0-9].
    result := replace( result, 'FE','FW');

    --Trata a excessão quando o termo >= 820 e < 900 o (1/9 => F[KLMNOPQRS] vai depois do . => I (J))
    IF (number>= 82 AND number < 90) OR (number >= 820 and number < 900 )
    THEN
        IF ( (content_v ~ E'^(([0-9]{3})|([0-9]{2}))\\([1-9].*$') OR (content_v ~ E'^(([0-9]{3})|([0-9]{2}))\\.[0-9]{1}\\([1-9].*$') )
        THEN
             resultAux = substring(result FROM position(')' in result));
             result = substring(result FROM 0 FOR position(')' in result));

             result := regexp_replace(result, 'F([NOPQRSTUV])', E'L\\1','g');
             result := result || resultAux;

         END IF;
    END IF;

    -- Substitui o ')' por um caractere de baixa prioridade.
    result = translate( result, ')', '5');

    --adiciona F na frente de cada caracter minusculo a fim de priorizar alguns caracteres
    result := trim( regexp_replace( result,'([a-z])',E'GX\\1','g') );

    --caso tenha complemento concatena
    IF complement IS NOT NULL AND result <> ''
    THEN
        result := result || '@' || complement;
    END IF;

    return result;
END;
$_$;
