#!/usr/bin/bash

# Cache database file...
cache_dir="{XDG_CONFIG_HOME}/dnf-cache"
[ -z "${XDG_CONFIG_HOME}" ] && cache_dir="${HOME}/.config/dnf-cache"
mkdir -p "${cache_dir}"

cache_db="${cache_dir}/packages.db"

# Error messages...
msg_help="
Utilitário de buscas no cache do DNF

Uso: dnf-cache opção

Opções:
    update - Atualiza o cache das buscas (requer sudo).
    clean  - Limpa backup do cache (requer sudo).
    help   - Exibe esta ajuda.

    search [PADRÃO]

           - Realiza uma busca pelo PADRÃO, retornando
             os pacotes e descrições correspondentes ao
             padrão da busca.

             Caso nenhum nome de pacote seja fornecido,
             todos os pacotes disponíveis serão
             exibidos.

    info PACOTE

           - Exibe informações sobre PACOTE.

"

msg_info_error="
Nenhum nome de pacote informado!
"

# Display help and exit with error if no option is provided...
[[ -z $1 ]] && echo "$msg_help" && exit 1

# Functions...

_dnf_cache_help() {
    echo "$msg_help"
    exit 0
}

_dnf_cache_update() {
    [ -f "${cache_db}" ] &&  mv $cache_db ${cache_db%.*}.$(date +'%Y%m%d%H%M')
    dnf-cache-update "${cache_db}"
    exit
}

_dnf_cache_clean() {
    rm -f ${cache_db%.*}.[0-9]*
    exit
}

_dnf_cache_search() {
    local _arch
    _arch=$(uname -m)
    local q=$(printf -- "SELECT pkg, summary FROM available WHERE arch in ('%s','noarch')" "${_arch}")
    [[ -z $1 ]] \
        && sqlite3 $cache_db "$q" | sed -e 's/|/: /' \
        || sqlite3 $cache_db "$q" | egrep -i $1 | sed -e 's/|/: /'
    exit
}

_dnf_cache_info() {

    [[ -z $1 ]] && echo "$msg_info_error" && exit 1

    local q="SELECT DISTINCT * FROM available WHERE pkg LIKE '$1' AND arch NOT LIKE 'i686' AND reponame NOT LIKE 'updates'"
    local r=$(sqlite3 $cache_db "$q")
    local header=${r%|*}

    echo ""
    awk  -F'|' '{
        print "Pacote     : "$1
        print "Versão     : "$2
        print "Arquitetura: "$3
        print "Sumário    : "$4
        print "Repositório: "$5
        print "Licença    : "$6
        print "\nDescrição: \n"
    }'  <<< "$header"
    echo "${r##*|}"
    echo ""

    exit
}

case $1 in

  search) _dnf_cache_search $2;;
    info) _dnf_cache_info $2;;
  update) _dnf_cache_update;;
   clean) _dnf_cache_clean;;
    help) _dnf_cache_help;;
       *) _dnf_cache_help;;

esac
