-- dfstatus 1.5 - a quick access status screen.
-- originally written by enjia2000@gmail.com

local gui = require 'gui'

dfstatus = defclass(dfstatus, gui.FramedScreen)
dfstatus.ATTRS = {
    frame_style = gui.GREY_LINE_FRAME,
    frame_title = 'dfstatus',
    frame_width = 16,
    frame_height = 17,
    frame_inset = 1,
    focus_path = 'dfstatus',
}

function dfstatus:onRenderBody(dc)
    local drink = 0
    local wood = 0
    --local meat = 0
    --local raw_fish = 0
    --local plants = 0
    local prepared_meals = 0

    local fuel = 0
    local pigiron = 0
    local iron = 0
    local steel = 0

    local silver = 0
    local copper = 0
    local gold = 0

    local tannedhides = 0
    local cloth = 0

    for _, item in ipairs(df.global.world.items.all) do
        if not item.flags.rotten and not item.flags.dump and not item.flags.forbid then
            if (item:getType() == df.item_type.WOOD) then wood = wood + item:getStackSize()
            elseif (item:getType() == df.item_type.DRINK) then drink = drink + item:getStackSize()
            elseif (item:getType() == df.item_type.SKIN_TANNED) then tannedhides = tannedhides + item:getStackSize()
            elseif (item:getType() == df.item_type.CLOTH) then cloth = cloth + item:getStackSize()
            --elseif (item:getType() == df.item_type.MEAT) then meat = meat + item:getStackSize()
            --elseif (item:getType() == df.item_type.FISH_RAW) then raw_fish = raw_fish + item:getStackSize()
            --elseif (item:getType() == df.item_type.PLANT) then plants = plants + item:getStackSize()
            elseif (item:getType() == df.item_type.FOOD) then prepared_meals = prepared_meals + item:getStackSize()
            elseif (item:getType() == df.item_type.BAR) then
                for token in string.gmatch(dfhack.items.getDescription(item,0),"[^%s]+") do
                    if (token == "silver") then silver = silver + item:getStackSize()
                    elseif (token == "charcoal" or token == "coke") then fuel = fuel + item:getStackSize()
                    elseif (token == "iron") then iron = iron + item:getStackSize()
                    elseif (token == "pig") then pigiron = pigiron + item:getStackSize()
                    elseif (token == "copper") then copper = copper + item:getStackSize()
                    elseif (token == "gold") then gold = gold + item:getStackSize()
                    elseif (token == "steel") then steel = steel + item:getStackSize()
                    end
                    break -- only need to look at the 1st token of each item.
                end
            end
        end
    end
    dc:pen(COLOR_LIGHTGREEN)
    dc:string("Drinks:  " .. drink)
    dc:newline(0)
    dc:string("Meals:   " .. prepared_meals)
    dc:newline(0)
    dc:newline(0)
    dc:string("Wood: " .. wood)
    dc:newline(0)
    dc:newline(0)
    dc:string("Hides: " .. tannedhides)
    dc:newline(0)
    dc:string("Cloth: " .. cloth)
    dc:newline(0)
    -- dc:string("Raw Fish: ".. raw_fish)
    -- dc:newline(0)
    -- dc:string("Plants: ".. plants)
    -- dc:newline(0)
    dc:newline(0)
    dc:string("Bars:")
    dc:newline(1)
    dc:string("Fuel:      " .. fuel)
    dc:newline(1)
    dc:string("Pig Iron:  " .. pigiron)
    dc:newline(1)
    dc:string("Steel:     " .. steel)
    dc:newline(1)
    dc:string("Iron:      " .. iron)
    dc:newline(1)
    dc:newline(1)
    dc:string("Copper:    " .. copper)
    dc:newline(1)
    dc:string("Silver:    " .. silver)
    dc:newline(1)
    dc:string("Gold:      " .. gold)
end

function dfstatus:onInput(keys)
    if keys.LEAVESCREEN or keys.SELECT then
        self:dismiss()
        scr = nil
    end
end

if not scr then
    scr = dfstatus()
    scr:show()
else
    scr:dismiss()
    scr = nil
end