#!/bin/bash

XGREP=xgrep
command xgrep &> /dev/null || XGREP=/home/soft/xgrep/bin/xgrep

if [ $# -ne 2 ]; then
    >&2 echo "Uso: ./tshell_p3.sh <axml> <acsv>"
    exit 1
fi

confere_arq_entrada() {
    IFS=. read -r NOME EXT <<< $1
    if [ $EXT != "xml.gz" ]; then
        >&2 echo "Erro: formato incorreto para $1 (deve ser .xml.gz)"
        exit 2
    fi
    if [ ! -f $1 ]; then
        >&2 echo "Erro: $1 não existe"
        exit 3
    fi
}

confere_arq_saida() {
    IFS=. read -r NOME EXT <<< $1
    if [ $EXT != "csv" ]; then
        >&2 echo "Erro: formato incorreto para $1 (deve ser .csv)"
        exit 2
    fi
    
    echo "version+pmid<title<abstract<keywords" > $1
}

XML=$1
confere_arq_entrada $XML
XML=$(realpath $XML)

CSV=$2
confere_arq_saida $CSV
CSV=$(realpath $CSV)

# converter o arquivo xml.gz para o formato csv
zcat $XML | \
$XGREP -tx "//PMID|//ArticleTitle|//Abstract|//MeshHeadingList" | \
# o sed acha os campos úteis -- PMID seguido de ArticleTitle seguido
# de Abstract, seguido ou não de MeshHeadingList -- e converte no
# formato csv. No caso de não haver MeshHeadingList para um dado artigo,
# insere uma linha vazia.
sed -En '
:x; /<PMID/{
    s/<PMID Version="//;
    s/">//;
    s/<\/PMID>/</;
    x;
    n;

    /<ArticleTitle>/{
        s/<ArticleTitle>//;
        s/ *<\/ArticleTitle>/</;
        H;
        n;

        /<Abstract>/{
            s/(<Abstract>|<AbstractText[^>]*>) *//g;
            s/ *<\/AbstractText> *(|<CopyrightInformation>)/, /g;
            s/(,|<\/CopyrightInformation>) *<\/Abstract>/</g;
            H;
            x;
            p;
            n;

            /<MeshHeadingList>/{
                s/(<\/DescriptorName>|<\/QualifierName>) *(<Qualifier[^>]*>|<\/MeshHeading> *)/, /g;
                s/(<MeshHeadingList> *|<MeshHeading> *<Descriptor[^>]*>|(, *|)<\/MeshHeadingList>)//g;
                p;
                d;
            };

            i \

            bx;
        };
        bx;
    };
    bx;
}' | \
# remover as quebras de linhas necessárias
awk 'BEGIN {RS=""} {gsub(/<\n/, "<", $0); print $0}' >> $CSV