--luacheck: ignore
-- science logs tab --

local Tabs = require 'comfy_panel.main'
local tables = require 'maps.biter_battles_v2.tables'
local event = require 'utils.event'
local bb_config = require 'maps.biter_battles_v2.config'
local food_values = tables.food_values
local food_long_and_short = tables.food_long_and_short
local food_long_to_short = tables.food_long_to_short
local forces_list = tables.forces_list
local science_list = tables.science_list
local evofilter_list = tables.evofilter_list
local food_value_table_version = tables.food_value_table_version
local Token = require 'utils.token'

local module_name = 'MutagenLog'

local function initialize_dropdown_users_choice()
    global.dropdown_users_choice_force = {}
    global.dropdown_users_choice_science = {}
    global.dropdown_users_choice_evo_filter = {}
end

local function get_science_text(food_name, food_short_name)
    return table.concat({'[img=item/', food_name, '][color=', food_values[food_name].color, ']', food_short_name, '[/color]'})
end

local function add_science_logs(player, element)
    local science_scrollpanel =
        element.add {type = 'scroll-pane', name = 'scroll_pane', direction = 'vertical', horizontal_scroll_policy = 'never', vertical_scroll_policy = 'auto'}
    science_scrollpanel.style.maximal_height = 530

    if global.science_logs_category_potion == nil then
        global.science_logs_category_potion = {}
        for i = 1, 7 do
            table.insert(global.science_logs_category_potion, get_science_text(food_long_and_short[i].long_name, food_long_and_short[i].short_name))
        end
    end
    if global.science_logs_total_north == nil then
        global.science_logs_total_north = {0}
        global.science_logs_total_south = {0}
        for i = 1, 7 do
            table.insert(global.science_logs_total_north, 0)
            table.insert(global.science_logs_total_south, 0)
        end
    end

    local t_summary = science_scrollpanel.add {type = 'table', name = 'science_logs_summary_header_table', column_count = 8}
    local width_summary_columns = tonumber(94)
    local width_summary_first_column = tonumber(110)
    local column_widths = {
        width_summary_first_column,
        width_summary_columns,
        width_summary_columns,
        width_summary_columns,
        width_summary_columns,
        width_summary_columns,
        width_summary_columns,
        width_summary_columns
    }
    local headersSummary = {
        [1] = '',
        [2] = global.science_logs_category_potion[1],
        [3] = global.science_logs_category_potion[2],
        [4] = global.science_logs_category_potion[3],
        [5] = global.science_logs_category_potion[4],
        [6] = global.science_logs_category_potion[5],
        [7] = global.science_logs_category_potion[6],
        [8] = global.science_logs_category_potion[7]
    }
    for _, w in ipairs(column_widths) do
        local label = t_summary.add {type = 'label', caption = headersSummary[_]}
        label.style.minimal_width = w
        label.style.maximal_width = w
    end

    summary_panel_table = science_scrollpanel.add {type = 'table', column_count = 8}
    local label = summary_panel_table.add {type = 'label', name = 'science_logs_total_north_header', caption = 'Total sent by north'}
    label.style.minimal_width = width_summary_first_column
    label.style.maximal_width = width_summary_first_column
    for i = 1, 7 do
        local label = summary_panel_table.add {type = 'label', name = 'science_logs_total_north_' .. i, caption = global.science_logs_total_north[i]}
        label.style.minimal_width = width_summary_columns
        label.style.maximal_width = width_summary_columns
    end
    science_scrollpanel.add({type = 'line'})

    summary_panel_table2 = science_scrollpanel.add {type = 'table', column_count = 8}
    local label = summary_panel_table2.add {type = 'label', name = 'science_logs_total_south_header', caption = 'Total sent by south'}
    label.style.minimal_width = width_summary_first_column
    label.style.maximal_width = width_summary_first_column
    for i = 1, 7 do
        local label = summary_panel_table2.add {type = 'label', name = 'science_logs_total_south' .. i, caption = global.science_logs_total_south[i]}
        label.style.minimal_width = width_summary_columns
        label.style.maximal_width = width_summary_columns
    end
    science_scrollpanel.add({type = 'line'})

    summary_panel_table3 = science_scrollpanel.add {type = 'table', column_count = 8}
    local label = summary_panel_table3.add {type = 'label', name = 'science_logs_total_passive_feed_header', caption = 'Total passive feed'}
    label.style.minimal_width = width_summary_first_column
    label.style.maximal_width = width_summary_first_column
    for i = 1, 7 do
        local text_passive_feed = '0'
        if global.total_passive_feed_redpotion ~= nil then
            text_passive_feed = math.round(global.total_passive_feed_redpotion * food_value_table_version[1] / food_value_table_version[i], 1)
        end
        local label = summary_panel_table3.add {type = 'label', name = 'science_logs_passive_feed' .. i, caption = text_passive_feed}
        label.style.minimal_width = width_summary_columns
        label.style.maximal_width = width_summary_columns
    end
    science_scrollpanel.add({type = 'line'})

    if global.dropdown_users_choice_force == nil then
        initialize_dropdown_users_choice()
    end
    if global.dropdown_users_choice_force[player.name] == nil then
        global.dropdown_users_choice_force[player.name] = 1
    end
    if global.dropdown_users_choice_science[player.name] == nil then
        global.dropdown_users_choice_science[player.name] = 1
    end
    if global.dropdown_users_choice_evo_filter[player.name] == nil then
        global.dropdown_users_choice_evo_filter[player.name] = 1
    end

    local t_filter = science_scrollpanel.add {type = 'table', name = 'science_logs_filter_table', column_count = 3}

    local dropdown_force = t_filter.add {name = 'dropdown-force', type = 'drop-down', items = forces_list, selected_index = global.dropdown_users_choice_force[player.name]}
    local dropdown_science = t_filter.add {name = 'dropdown-science', type = 'drop-down', items = science_list, selected_index = global.dropdown_users_choice_science[player.name]}
    local dropdown_evofilter =
        t_filter.add {name = 'dropdown-evofilter', type = 'drop-down', items = evofilter_list, selected_index = global.dropdown_users_choice_evo_filter[player.name]}

    local t = science_scrollpanel.add {type = 'table', name = 'science_logs_header_table', column_count = 4}
    local column_widths = {tonumber(75), tonumber(310), tonumber(165), tonumber(230)}
    local headers = {
        [1] = 'Time',
        [2] = 'Details',
        [3] = 'Evo jump',
        [4] = 'Threat jump'
    }
    for _, w in ipairs(column_widths) do
        local label = t.add {type = 'label', caption = headers[_]}
        label.style.minimal_width = w
        label.style.maximal_width = w
        label.style.font = 'default-bold'
        label.style.font_color = {r = 0.98, g = 0.66, b = 0.22}
        if _ == 1 then
            label.style.horizontal_align = 'center'
        end
    end

    local n = bb_config.north_side_team_name
    local s = bb_config.south_side_team_name
    if global.tm_custom_name['north'] then
        n = global.tm_custom_name['north']
    end
    if global.tm_custom_name['south'] then
        s = global.tm_custom_name['south']
    end
    local team_strings = {
        ['north'] = table.concat({'[color=120, 120, 255]', n, '[/color]'}),
        ['south'] = table.concat({'[color=255, 65, 65]', s, '[/color]'})
    }
    if global.science_logs_date then
        for i = 1, #global.science_logs_date, 1 do
            local real_force_name = global.science_logs_fed_team[i]
            local custom_force_name = team_strings[real_force_name]
            local easy_food_name = food_long_to_short[global.science_logs_food_name[i]].short_name

            if dropdown_force.selected_index == 1 or real_force_name:match(dropdown_force.get_item(dropdown_force.selected_index)) then
                if
                    dropdown_science.selected_index == 1 or
                        (dropdown_science.selected_index == 2 and (easy_food_name:match('space') or easy_food_name:match('utility') or easy_food_name:match('production'))) or
                        (dropdown_science.selected_index == 3 and
                            (easy_food_name:match('space') or easy_food_name:match('utility') or easy_food_name:match('production') or easy_food_name:match('chemical'))) or
                        (dropdown_science.selected_index == 4 and
                            (easy_food_name:match('space') or easy_food_name:match('utility') or easy_food_name:match('production') or easy_food_name:match('chemical') or
                                easy_food_name:match('military'))) or
                        easy_food_name:match(dropdown_science.get_item(dropdown_science.selected_index))
                 then
                    if
                        dropdown_evofilter.selected_index == 1 or (dropdown_evofilter.selected_index == 2 and (global.science_logs_evo_jump_difference[i] > 0)) or
                            (dropdown_evofilter.selected_index == 3 and (global.science_logs_evo_jump_difference[i] >= 10)) or
                            (dropdown_evofilter.selected_index == 4 and (global.science_logs_evo_jump_difference[i] >= 5)) or
                            (dropdown_evofilter.selected_index == 5 and (global.science_logs_evo_jump_difference[i] >= 4)) or
                            (dropdown_evofilter.selected_index == 6 and (global.science_logs_evo_jump_difference[i] >= 3)) or
                            (dropdown_evofilter.selected_index == 7 and (global.science_logs_evo_jump_difference[i] >= 2)) or
                            (dropdown_evofilter.selected_index == 8 and (global.science_logs_evo_jump_difference[i] >= 1))
                     then
                        science_panel_table = science_scrollpanel.add {type = 'table', column_count = 4}
                        local label = science_panel_table.add {type = 'label', name = 'science_logs_date' .. i, caption = global.science_logs_date[i]}
                        label.style.minimal_width = column_widths[1]
                        label.style.maximal_width = column_widths[1]
                        label.style.horizontal_align = 'center'
                        local label = science_panel_table.add {type = 'label', name = 'science_logs_text' .. i, caption = global.science_logs_text[i] .. custom_force_name}
                        label.style.minimal_width = column_widths[2]
                        label.style.maximal_width = column_widths[2]
                        local label =
                            science_panel_table.add {
                            type = 'label',
                            name = 'science_logs_evo_jump' .. i,
                            caption = global.science_logs_evo_jump[i] .. '   [color=200,200,200](+' .. global.science_logs_evo_jump_difference[i] .. ')[/color]'
                        }
                        label.style.minimal_width = column_widths[3]
                        label.style.maximal_width = column_widths[3]
                        local label =
                            science_panel_table.add {
                            type = 'label',
                            name = 'science_logs_threat' .. i,
                            caption = global.science_logs_threat[i] .. '   [color=200,200,200](+' .. global.science_logs_threat_jump_difference[i] .. ')[/color]'
                        }
                        label.style.minimal_width = column_widths[4]
                        label.style.maximal_width = column_widths[4]
                        science_scrollpanel.add({type = 'line'})
                    end
                end
            end
        end
    end
end

local function comfy_panel_get_active_frame(player)
    if not player.gui.left.comfy_panel then
        return false
    end
    if not player.gui.left.comfy_panel.tabbed_pane.selected_tab_index then
        return player.gui.left.comfy_panel.tabbed_pane.tabs[1].content
    end
    return player.gui.left.comfy_panel.tabbed_pane.tabs[player.gui.left.comfy_panel.tabbed_pane.selected_tab_index].content
end

local function build_config_gui(data)
    local player = data.player
    local frame_sciencelogs = comfy_panel_get_active_frame(player)
    if not frame_sciencelogs then
        return
    end
    frame_sciencelogs.clear()
    add_science_logs(player, frame_sciencelogs)
end

local build_config_gui_token = Token.register(build_config_gui)

local function on_gui_selection_state_changed(event)
    local player = game.players[event.player_index]
    if not event.element.valid then
        return
    end
    local name = event.element.name
    if global.dropdown_users_choice_force == nil then
        initialize_dropdown_users_choice()
    end
    if name == 'dropdown-force' then
        global.dropdown_users_choice_force[player.name] = event.element.selected_index
        build_config_gui({player = player})
    end
    if name == 'dropdown-science' then
        global.dropdown_users_choice_science[player.name] = event.element.selected_index
        build_config_gui({player = player})
    end
    if name == 'dropdown-evofilter' then
        global.dropdown_users_choice_evo_filter[player.name] = event.element.selected_index
        build_config_gui({player = player})
    end
end

event.add(defines.events.on_gui_selection_state_changed, on_gui_selection_state_changed)

Tabs.add_tab_to_gui({name = module_name, id = build_config_gui_token, admin = false})
