#!/usr/bin/env zsh
DVNUTS=(
"Vitamin A"         "IU"    5000
"Vitamin C"         "mg"    60
"Thiamin"           "mg"    1.5
"Riboflavin"        "mg"    1.7
"Niacin"            "mg"    20
"Calcium"           "mg"    1000
"Iron"              "mg"    18
"Vitamin D"         "IU"    400
"Vitamin E"         "IU"    30
"Vitamin B6"        "mg"    2
"Folic acid"        "mg"    .4
"Vitamin B12"       "mcg"   6
"Phosphorus"        "g"     1
"Iodine"            "mcg"   150
"Magnesium"         "mg"    400
"Zinc"              "mg"    15
"Copper"            "mg"    2
"Biotin"            "mg"    .3
"Pantothenic Acid"  "mg"    10
)

function addDvNut
{
    typeset -F nutAmt pctAmt dvAmt
    typeset nutNameWithUnits
    pctAmt=$2
    if [[ -z ${DV_VALUE_LOOKUP[$1]} ]]; then
        echo "addFoods: warning: DV nutrient $1 not found." 1>&2
        return
    fi
    dvAmt=DV_VALUE_LOOKUP[$1]
    (( nutAmt = pctAmt / 100 * dvAmt ))
    nutNameWithUnits="${1}, ${DV_UNIT_LOOKUP[$1]}"
    args+=(--change-nut $nutNameWithUnits $nutAmt)
}

function addNutArgs
{
    local dvNutName dvNutUnits dvValue
    typeset -A DV_UNIT_LOOKUP DV_VALUE_LOOKUP
    for dvNutName dvNutUnits dvValue in $DVNUTS
    do
        DV_UNIT_LOOKUP[$dvNutName]=$dvNutUnits
        DV_VALUE_LOOKUP[$dvNutName]=$dvValue
    done

    local nutName nutValue nutNameNoPct
    for nutName nutValue in $NUTS; do
        args+=(--change-nut $nutName $nutValue)
        if echo -nE "$nutName" | egrep '.*, %$' &> /dev/null; then
            addDvNut ${nutName%, %} $nutValue
        fi
    done
}

function addTraitArgs
{
    for traitName traitValue in ${(kv)TRAITS}
    do
        args+=(--change $traitName $traitValue)
    done
}

function addAvailUnitsArgs
{
    for availUnitName availUnitAmt in $AVAIL_UNITS
    do
        args+=(--change-avail-unit $availUnitName $availUnitAmt )
    done
}

function addCollectionsArgs
{
    for collection in $COLLECTIONS
    do
        args+=(--add $collection )
    done
}

function checkForDupes
{
    local collection result
    for collection in $COLLECTIONS
    do
        result=$(pantry --print name --search name $1 $collection 2>/dev/null)
        if [[ -n $result ]]; then
            echo "addFoods: error: $1: duplicate food name" 1>&2
            exit 1
        fi
    done
}

function addFile
{
    local NUTS AVAIL_UNITS COLLECTIONS args
    typeset -A TRAITS
    args=(--exact-match --create --print name --print info --print nuts)
    source $1
    checkForDupes ${TRAITS[name]}
    addTraitArgs
    addNutArgs
    addAvailUnitsArgs
    addCollectionsArgs
    pantry $args
}

for filename
do
    if [[ -z $filename ]]; then
        echo "addFoods: error: empty filename argument." 1>&2
        exit 1
    fi
    filenames+=($filename)
done

unset filename
for filename in $filenames; do
    addFile $filename
done
