--
-- Basic Unit Overview
--

local core         = require("graphics.core")

local style        = require("coordinator.ui.style")

local reactor_view = require("coordinator.ui.components.reactor")
local boiler_view  = require("coordinator.ui.components.boiler")
local turbine_view = require("coordinator.ui.components.turbine")

local Div          = require("graphics.elements.div")
local PipeNetwork  = require("graphics.elements.pipenet")
local TextBox      = require("graphics.elements.textbox")

local TEXT_ALIGN = core.graphics.TEXT_ALIGN

local pipe = core.graphics.pipe

-- make a new unit overview window
---@param parent graphics_element parent
---@param x integer top left x
---@param y integer top left y
---@param unit ioctl_unit unit database entry
local function make(parent, x, y, unit)
    local height = 0
    local num_boilers = #unit.boiler_data_tbl
    local num_turbines = #unit.turbine_data_tbl

    assert(num_boilers  >= 0 and num_boilers  <= 2, "minimum 0 boilers, maximum 2 boilers")
    assert(num_turbines >= 1 and num_turbines <= 3, "minimum 1 turbine, maximum 3 turbines")

    if num_boilers == 0 and num_turbines == 1 then
        height = 9
    elseif num_boilers == 1 and num_turbines <= 2 then
        height = 17
    else
        height = 25
    end

    assert(parent.height() >= (y + height), "main display not of sufficient vertical resolution (add an additional row of monitors)")

    -- bounding box div
    local root = Div{parent=parent,x=x,y=y,width=80,height=height}

    -- unit header message
    TextBox{parent=root,text="Unit #"..unit.unit_id,alignment=TEXT_ALIGN.CENTER,height=1,fg_bg=style.header}

    -------------
    -- REACTOR --
    -------------

    reactor_view(root, 1, 3, unit.reactor_data, unit.unit_ps)

    if num_boilers > 0 then
        local coolant_pipes = {}

        if num_boilers >= 2 then
            table.insert(coolant_pipes, pipe(0, 0, 11, 12, colors.lightBlue))
        end

        table.insert(coolant_pipes, pipe(0, 0, 11, 3, colors.lightBlue))
        table.insert(coolant_pipes, pipe(2, 0, 11, 2, colors.orange))

        if num_boilers >= 2 then
            table.insert(coolant_pipes, pipe(2, 0, 11, 11, colors.orange))
        end

        PipeNetwork{parent=root,x=4,y=10,pipes=coolant_pipes,bg=colors.lightGray}
    end

    -------------
    -- BOILERS --
    -------------

    if num_boilers >= 1 then boiler_view(root, 16, 11, unit.boiler_ps_tbl[1]) end
    if num_boilers >= 2 then boiler_view(root, 16, 19, unit.boiler_ps_tbl[2]) end

    --------------
    -- TURBINES --
    --------------

    local t_idx = 1
    local no_boilers = num_boilers == 0

    if (num_turbines >= 3) or no_boilers or (num_boilers == 1 and num_turbines >= 2) then
        turbine_view(root, 58, 3, unit.turbine_ps_tbl[t_idx])
        t_idx = t_idx + 1
    end

    if (num_turbines >= 1 and not no_boilers) or num_turbines >= 2 then
        turbine_view(root, 58, 11, unit.turbine_ps_tbl[t_idx])
        t_idx = t_idx + 1
    end

    if (num_turbines >= 2 and num_boilers >= 2) or num_turbines >= 3 then
        turbine_view(root, 58, 19, unit.turbine_ps_tbl[t_idx])
    end

    local steam_pipes_b = {}

    if no_boilers then
        table.insert(steam_pipes_b, pipe(0, 1, 3, 1, colors.white))     -- steam to turbine 1
        table.insert(steam_pipes_b, pipe(0, 2, 3, 2, colors.blue))      -- water to turbine 1

        if num_turbines >= 2 then
            table.insert(steam_pipes_b, pipe(1, 2, 3, 9, colors.white)) -- steam to turbine 2
            table.insert(steam_pipes_b, pipe(2, 3, 3, 10, colors.blue)) -- water to turbine 2
        end

        if num_turbines >= 3 then
            table.insert(steam_pipes_b, pipe(1, 9, 3, 17, colors.white))   -- steam boiler 1 to turbine 1 junction end
            table.insert(steam_pipes_b, pipe(2, 10, 3, 18, colors.blue))    -- water boiler 1 to turbine 1 junction start
        end
    else
        -- boiler side pipes
        local steam_pipes_a = {
            -- boiler 1 steam/water pipes
            pipe(0, 1, 6, 1, colors.white, false, true),    -- steam boiler 1 to turbine junction
            pipe(0, 2, 6, 2, colors.blue, false, true)      -- water boiler 1 to turbine junction
        }

        if num_boilers >= 2 then
            -- boiler 2 steam/water pipes
            table.insert(steam_pipes_a, pipe(0, 9, 6, 9, colors.white, false, true))    -- steam boiler 2 to turbine junction
            table.insert(steam_pipes_a, pipe(0, 10, 6, 10, colors.blue, false, true))   -- water boiler 2 to turbine junction
        end

        -- turbine side pipes

        if num_turbines >= 3 or (num_boilers == 1 and num_turbines == 2) then
            table.insert(steam_pipes_b, pipe(0, 9, 1, 2, colors.white, false, true))    -- steam boiler 1 to turbine 1 junction start
            table.insert(steam_pipes_b, pipe(1, 1, 3, 1, colors.white, false, false))   -- steam boiler 1 to turbine 1 junction end
        end

        table.insert(steam_pipes_b, pipe(0, 9, 3, 9, colors.white, false, true))        -- steam boiler 1 to turbine 2

        if num_turbines >= 3 or (num_boilers == 1 and num_turbines == 2) then
            table.insert(steam_pipes_b, pipe(0, 10, 2, 3, colors.blue, false, true))    -- water boiler 1 to turbine 1 junction start
            table.insert(steam_pipes_b, pipe(2, 2, 3, 2, colors.blue, false, false))    -- water boiler 1 to turbine 1 junction end
        end

        table.insert(steam_pipes_b, pipe(0, 10, 3, 10, colors.blue, false, true))       -- water boiler 1 to turbine 2

        if num_turbines >= 3 or (num_turbines >= 2 and num_boilers >= 2) then
            if num_boilers >= 2 then
                table.insert(steam_pipes_b, pipe(0, 17, 1, 9, colors.white, false, true))   -- steam boiler 2 to turbine 2 junction
                table.insert(steam_pipes_b, pipe(0, 17, 3, 17, colors.white, false, true))  -- steam boiler 2 to turbine 3

                table.insert(steam_pipes_b, pipe(0, 18, 2, 10, colors.blue, false, true))   -- water boiler 2 to turbine 3
                table.insert(steam_pipes_b, pipe(0, 18, 3, 18, colors.blue, false, true))   -- water boiler 2 to turbine 2 junction
            else
                table.insert(steam_pipes_b, pipe(1, 17, 1, 9, colors.white, false, true))   -- steam boiler 2 to turbine 2 junction
                table.insert(steam_pipes_b, pipe(1, 17, 3, 17, colors.white, false, true))  -- steam boiler 2 to turbine 3

                table.insert(steam_pipes_b, pipe(2, 18, 2, 10, colors.blue, false, true))   -- water boiler 2 to turbine 3
                table.insert(steam_pipes_b, pipe(2, 18, 3, 18, colors.blue, false, true))   -- water boiler 2 to turbine 2 junction
            end
        elseif num_turbines == 1 and num_boilers >= 2 then
            table.insert(steam_pipes_b, pipe(0, 17, 1, 9, colors.white, false, true))       -- steam boiler 2 to turbine 2 junction
            table.insert(steam_pipes_b, pipe(0, 17, 1, 17, colors.white, false, true))      -- steam boiler 2 to turbine 3

            table.insert(steam_pipes_b, pipe(0, 18, 2, 10, colors.blue, false, true))       -- water boiler 2 to turbine 3
            table.insert(steam_pipes_b, pipe(0, 18, 2, 18, colors.blue, false, true))       -- water boiler 2 to turbine 2 junction
        end

        PipeNetwork{parent=root,x=47,y=11,pipes=steam_pipes_a,bg=colors.lightGray}
    end

    PipeNetwork{parent=root,x=54,y=3,pipes=steam_pipes_b,bg=colors.lightGray}

    return root
end

return make