#!/bin/sh

arquivo_csv=""
limite=0

# Caso a variavel _DEBUG nao tenha sido preparada externamente,
# assumir que o default é sem DEBUG
if [ -z "${_DEBUG}" ]
then
	_DEBUG="0"
fi

# Default verboso
if [ -z "${_VERBOSE}" ]
then
	_VERBOSE="1"
fi

PrintDebug( )
{
	# para a mensagem ser mostrada, _DEBUG deve ser configurada
	# e o valor deve ser diferente de "0"
	if [ -n "${_DEBUG}" -a "${_DEBUG}" -ne "0" ]
	then
		echo "$@"
	fi
}

PrintHelp( )
{
	PrintMessage `basename "${0}"` " -- importa tabelas de cidades do IBGE"
	PrintMessage "Opcoes aceitas:"
	PrintMessage "	arquivo_csv=[caminho]"
	PrintMessage "		informa o caminho para o arquivo no formato 2009"
	PrintMessage "	limite=N"
	PrintMessage "		determina a quantidade maxima de registros de entrada processados"
	PrintMessage "	_VERBOSE=[verbose]"
	PrintMessage "		0 para nao mostrar mensagens, 1 para mostrar"
	PrintMessage "	_DEBUG=[debug]"
	PrintMessage "		0 para nao mostrar mensagens de depuracao, 1 para mostrar"
}

PrintMessage( )
{
	# para a mensagem NAO ser mostrada, _VERBOSE deve ser configurada
	# e o valor deve ser "0"
	if [ -z "${_VERBOSE}" -o "${_VERBOSE}" -ne "0" ]
	then
		echo "$@"
	fi
}

# Processar os argumentos passados pela linha de comando. Devem estar no
# formato de atribuicao de variaveis em Shell, ou entao devem ser atribuidos
# e exportados pelo processo chamador. Caso na expressao [var]=[valor] exista
# separadores, todo o argumento deve estar entre aspas: "[var]=[valor]"
while [ "${#}" -gt 0 ]
do
	if echo "${1}" | grep "=" 2>&1 > /dev/null
	then
		PrintDebug "Argumento de configuracao: \"${1}\""
		eval "${1}"
	else
		PrintDebug "Argumento desconhecido: \"${1}\""
		PrintHelp
		exit 1
	fi

	shift
done

####################################
# Secao de validacao de parametros
if [ -z "${arquivo_csv}" ]
then
	PrintMessage "ERRO: informe o arquivo de importacao."
	PrintHelp
	exit 2
fi

if [ ! -f "${arquivo_csv}" ]
then
	PrintMessage "ERRO: o arquivo de importacao nao existe ou nao pode ser acessado (\"${arquivo_csv}\")."
	PrintHelp
	exit 3
fi

if [ ! -r "${arquivo_csv}" ]
then
	PrintMessage "ERRO: o arquivo de importacao nao pode ser lido (\"${arquivo_csv}\")."
	PrintHelp
	exit 4
fi

# filtrar o arquivo original para area de trabalho, por
# UF, Mesorregiao, Microrregiao, Municipio e depois executar
# os scripts Python para atualização do banco.
# O formato do arquivo obtido do IBGE e' CSV com as seguintes colunas:
#
# 1: "UF"
# 2: "Nome_UF"
# 3: "MesorregiãoGeográfica"
# 4: "MesorregiãoGeográfica_Nome"
# 5: "MicrorregiãoGeográfica"
# 6: "MicrorregiãoGeográfica_Nome"
# 7: "Município"
# 8: "Município_Nome"
# 9: "Distrito"
# 10: "Distrito_Nome"
# 11: "Subdistrito"
# 12: "Subdistrito_Nome"

nome_base=sigi_ibge_import
niveis="uf mesorregiao microrregiao municipio"
for nivel in $niveis
do
	eval "arquivo_${nivel}=/tmp/${nome_base}.${nivel}.csv"
done

exec 3< "${arquivo_csv}" 4> "${arquivo_uf}" 5> "${arquivo_mesorregiao}" 6> "${arquivo_microrregiao}" 7> "${arquivo_municipio}"

lnum=0

PrintMessage "Iniciando leitura dos dados..."

read linha <&3
while read linha <&3
do
	lnum=$(($lnum + 1))
	if [ $(($lnum % 100)) -eq 0 ]
	then
		PrintMessage -n "${lnum} "
	fi
	# extrair o codigo da regiao a partir do codigo da UF
	# e criar o novo campo 1 com o codigo da regiao
	codregiao=`echo "$linha" | cut -b2-2`
	linha="\"${codregiao}\",$linha"
	# UFs: cod_regiao,cod_uf,nome_uf
	#	-- a sigla por enquanto devera ser adicionada manualmente
	echo "$linha" | cut -s -d, -f1,2,3 >&4
	# Mesorregiao: cod_regiao,cod_uf,cod_mesorregiao,nome_mesorregiao
	echo "$linha" | cut -s -d, -f1,2,4,5 >&5
	# Microrregiao: cod_regiao,cod_uf,cod_mesorregiao,cod_microrregiao,nome_microrregiao
	echo "$linha" | cut -s -d, -f1,2,4,6,7 >&6
	# Municipio: cod_regiao,cod_uf,cod_mesorregiao,cod_microrregiao,cod_municipio,nome_municipio
	# 7> "${arquivo_municipio}"
	echo "$linha" | cut -s -d, -f1,2,4,6,8,9 >&7
	if [ -n "${limite}" -a "${limite}" -gt 0 -a "${lnum}" -ge "${limite}" ]
	then
		break
	fi
done

PrintMessage "\n${lnum} registros processados"

# fecha os descritores de saida
exec 3<&- 4>&- 5>&- 6>&- 7>&-

for nivel in $niveis
do
	eval "arq_in=/tmp/${nome_base}.${nivel}.csv"
	eval "arq_out=/tmp/${nome_base}.${nivel}.csv.tmp"
	sort < $arq_in > $arq_out
	uniq < $arq_out > $arq_in
	rm $arq_out
done

ifs="$IFS"
IFS="
"
for l in `wc -l /tmp/${nome_base}*`
do
	PrintDebug $l
done
IFS="$ifs"

# Processar arquivos: INSERT ou UPDATE no banco