-- This file is part of thesixthroc's Pirate Ship softmod, licensed under GPLv3 and stored at https://github.com/ComfyFactory/ComfyFactorio and https://github.com/danielmartin0/ComfyFactorio-Pirates.

local Memory = require('maps.pirates.memory')
local Math = require('maps.pirates.math')
local Common = require('maps.pirates.common')
local CoreData = require('maps.pirates.coredata')
local Utils = require('maps.pirates.utils_local')
local GuiEvo = require('maps.pirates.gui.evo')
local GuiProgress = require('maps.pirates.gui.progress')
local GuiRuns = require('maps.pirates.gui.runs')
local GuiCrew = require('maps.pirates.gui.crew')
local GuiClasses = require('maps.pirates.gui.classes')
local GuiMinimap = require('maps.pirates.gui.minimap')
local GuiInfo = require('maps.pirates.gui.info')
local GuiTreasure = require('maps.pirates.gui.treasure')
local Quest = require('maps.pirates.quest')
local Balance = require('maps.pirates.balance')
local _inspect = require('utils.inspect').inspect
local GuiCommon = require('maps.pirates.gui.common')
local Boats = require('maps.pirates.structures.boats.boats')
local Hold = require('maps.pirates.surfaces.hold')
local Cabin = require('maps.pirates.surfaces.cabin')
local Crowsnest = require('maps.pirates.surfaces.crowsnest')
local Progression = require('maps.pirates.progression')
local Surfaces = require('maps.pirates.surfaces.surfaces')
-- local Roles = require 'maps.pirates.roles.roles'
local Permissions = require('maps.pirates.permissions')
local IslandEnum = require('maps.pirates.surfaces.islands.island_enum')
local Kraken = require('maps.pirates.surfaces.sea.kraken')
local GuiWelcome = require('maps.pirates.gui.welcome')
local ComfyGui = require('utils.gui')
local BuriedTreasure = require('maps.pirates.buried_treasure')
ComfyGui.set_disabled_tab('Scoreboard', true)
ComfyGui.set_disabled_tab('Groups', true)

local Public = {}

Public.progress = require('maps.pirates.gui.progress')
Public.runs = require('maps.pirates.gui.runs')
Public.crew = require('maps.pirates.gui.crew')
Public.classes = require('maps.pirates.gui.classes')
Public.minimap = require('maps.pirates.gui.minimap')
Public.info = require('maps.pirates.gui.info')
Public.color = require('maps.pirates.gui.color')
Public.treasure = require('maps.pirates.gui.treasure')
local function create_gui(player)
	local flow1, flow2, flow3, flow4

	flow1 = player.gui.top

	flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'info_piratebutton')
	flow2.caption = '?'
	flow2.style.font = 'debug'
	flow2.tooltip = { 'pirates.gui_info_main_tooltip' }
	flow2.style.font_color = { r = 1, g = 1, b = 1 }
	flow2.style.hovered_font_color = { r = 1, g = 1, b = 1 }
	flow2.style.clicked_font_color = { r = 1, g = 1, b = 1 }
	flow2.parent.style.left_padding = -6

	flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'runs_piratebutton', 70)
	flow2.caption = { 'pirates.gui_crews' }
	flow2.tooltip = { 'pirates.gui_crews_main_tooltip' }
	flow2.style.font = 'debug'
	flow2.style.font_color = { r = 1, g = 1, b = 1 }
	flow2.style.hovered_font_color = { r = 1, g = 1, b = 1 }
	flow2.style.clicked_font_color = { r = 1, g = 1, b = 1 }
	flow2.parent.style.width = 67
	flow2.parent.style.left_padding = -6

	-- optional use of left gui:
	-- flowleft = player.gui.left
	-- flow2 = GuiCommon.flow_add_floating_sprite_button(flowleft, 'crew_piratebutton')
	-- flow2.sprite = 'utility/spawn_flag'
	flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'crew_piratebutton')
	flow2.sprite = 'utility/spawn_flag'

	flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'classes_piratebutton')
	flow2.sprite = 'item/light-armor'

	-- flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'lives_piratebutton')
	-- flow2.tooltip = 'Lives\n\nWhen a silo is destroyed before its rocket is launched, you lose a life.\n\nLosing all your lives is one way to lose the game.'
	-- flow2.mouse_button_filter = {'middle'}

	-- flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'distance_travelled_piratebutton')
	-- flow2.tooltip = 'Leagues travelled in the overworld\n\nCrews progress through the game by travelling in the overworld. Travel ' .. CoreData.victory_x/40 .. ' leagues = victory.'
	-- flow2.sprite = 'item/rail'
	-- flow2.mouse_button_filter = {'middle'}

	-- flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'destination_piratebutton')
	-- flow2.tooltip = 'Location window\n\nWhere am I?'
	-- flow2.sprite = 'item/landfill'

	flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'progress_piratebutton')
	flow2.sprite = 'item/rail'

	flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'evo_piratebutton')
	flow2.sprite = 'entity/small-biter'
	flow2.mouse_button_filter = { 'middle' } --hack to avoid press visual
	flow2.show_percent_for_small_numbers = true --as of factorio v1.1.59, there is a bug in which 1.002 displays as like 1e-2% or something. but after 1.01 it's ok

	flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'treasure_piratebutton')
	flow2.tooltip = { 'pirates.gui_treasure_main_tooltip' }
	flow2.sprite = 'utility/gps_map_icon'

	flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'minimap_piratebutton')
	flow2.tooltip = { 'pirates.gui_minimap_main_tooltip' }
	flow2.sprite = 'utility/map'

	-- flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'shop_piratebutton')
	-- flow2.tooltip = "Coal/Officer's Shop\n\nThe captain and their officers are authorised to spend coal in the shop."
	-- flow2.sprite = 'item/coal'

	flow2 = flow1.add({
		name = 'fuel_flow',
		type = 'frame',
	})
	flow2.style.minimal_width = 80
	flow2.style.natural_width = 80
	flow2.style.minimal_height = 40
	flow2.style.maximal_height = 40
	flow2.style.left_padding = 4
	flow2.style.right_padding = 4
	flow2.style.top_padding = 3

	-- interactive version:
	-- flow2 = GuiCommon.flow_add_floating_button(flow1, 'fuel_piratebutton')

	flow3 = flow2.add({
		name = 'fuel_label_0',
		type = 'label',
		caption = '',
	})
	flow3.style.font = 'default-large-semibold'
	flow3.style.font_color = GuiCommon.bold_font_color
	flow3.caption = { 'pirates.gui_fuel_1' }

	flow3 = flow2.add({
		name = 'fuel_label_1',
		type = 'label',
		caption = '',
	})
	flow3.style.font = 'default-large'
	flow3.style.font_color = GuiCommon.default_font_color
	-- flow3.style.font_color = GuiCommon.bold_font_color
	-- flow4.style.top_margin = -36
	-- flow4.style.left_margin = -100
	-- flow3.style.horizontal_align = 'center'
	-- flow4.style.left_padding = -5
	flow3.style.left_margin = -2

	flow3 = flow2.add({
		name = 'fuel_label_2',
		type = 'label',
		caption = '',
	})
	flow3.style.font = 'default-large'
	flow3.style.left_margin = 3

	flow2 = GuiCommon.flow_add_floating_button(flow1, 'etaframe_piratebutton')
	-- flow2.style.right_padding = -100
	-- flow2.enabled = false

	flow3 = flow2.add({
		name = 'etaframe_label_1',
		type = 'label',
	})
	flow3.style.font = 'default-large-semibold'
	flow3.style.font_color = GuiCommon.bold_font_color

	flow3 = flow2.add({
		name = 'etaframe_label_2',
		type = 'label',
	})
	flow3.style.left_margin = 1
	flow3.style.font = 'default-large'
	flow3.style.font_color = GuiCommon.default_font_color

	flow3 = flow2.add({
		name = 'etaframe_label_3',
		type = 'label',
	})
	flow3.style.left_margin = 3
	flow3.style.font = 'default-large-semibold'
	flow3.style.font_color = GuiCommon.bold_font_color

	flow3 = flow2.add({ type = 'table', name = 'cost_table', column_count = #CoreData.cost_items })
	for i = 1, #CoreData.cost_items do
		flow4 = flow3.add({ type = 'sprite-button', name = 'cost_' .. i, number = 0 })
		-- flow4.mouse_button_filter = {'middle'}
		flow4.sprite = CoreData.cost_items[i].sprite_name
		flow4.enabled = false
		flow4.style.top_margin = -6
		flow4.style.right_margin = -6
		flow4.style.maximal_height = 38
		flow4.visible = false
	end
	-- and
	flow4 = flow3.add({ type = 'sprite-button', name = 'cost_launch_rocket' })
	-- flow4.mouse_button_filter = {'middle'}
	flow4.sprite = 'item/rocket-silo'
	flow4.enabled = false
	flow4.style.top_margin = -6
	flow4.style.right_margin = -6
	flow4.style.maximal_height = 38
	flow4.visible = false

	flow3.style.left_margin = -1
	flow3.style.right_margin = -2 --to get to the end of the button frame

	-- flow2 = flow1.add({
	-- 	name = 'time_remaining_frame',
	-- 	type = 'frame',
	-- })
	-- flow2.style.minimal_width = 100
	-- flow2.style.natural_width = 100
	-- flow2.style.minimal_height = 40
	-- flow2.style.maximal_height = 40
	-- flow2.style.left_padding = 4
	-- flow2.style.right_padding = 4
	-- flow2.style.top_padding = 3
	-- flow2.tooltip = tooltip

	-- flow3 = flow2.add({
	-- 	name = 'time_remaining_label_1',
	-- 	type = 'label',
	-- 	caption = 'Max Time:'
	-- })
	-- flow3.style.font = 'default-large-semibold'
	-- flow3.style.font_color = GuiCommon.bold_font_color
	-- flow3.tooltip = tooltip

	-- flow3 = flow2.add({
	-- 	name = 'time_remaining_label_2',
	-- 	type = 'label',
	-- })
	-- flow3.style.left_margin = 2
	-- flow3.style.font = 'default-large'
	-- flow3.style.font_color = GuiCommon.default_font_color
	-- flow3.tooltip = tooltip

	-- flow3 = flow2.add({
	-- 	name = 'rage_table',
	-- 	type = 'table',
	-- 	column_count = 5,
	-- })
	-- flow3.style.top_margin = 6
	-- flow3.style.left_margin = 4
	-- for i = 1, 6 do
	-- 	flow4 = flow3.add({type = 'progressbar', name = 'bar_' .. i, value = 0.5})
	-- 	flow4.style.width = 18
	-- 	flow4.style.height = 5
	-- end

	-- flow2 = flow1.add({
	-- 	name = 'cost_frame',
	-- 	type = 'frame',
	-- })
	-- flow2.style.minimal_width = 100
	-- flow2.style.natural_width = 100
	-- flow2.style.minimal_height = 40
	-- flow2.style.maximal_height = 40
	-- flow2.style.left_padding = 4
	-- flow2.style.right_padding = 4
	-- flow2.style.top_padding = 3

	-- -- flow3 = flow2.add({
	-- -- 	name = 'cost_label_1',
	-- -- 	type = 'label',
	-- -- })
	-- -- flow3.style.font = 'default-large-semibold'
	-- -- flow3.style.font_color = GuiCommon.bold_font_color

	-- -- flow3 = flow2.add({
	-- -- 	name = 'cost_label_2',
	-- -- 	type = 'label',
	-- -- })
	-- -- flow3.style.font = 'default-large'
	-- -- flow3.style.font_color = GuiCommon.default_font_color

	-- flow3 = flow2.add({type = 'table', name = 'cost_table', column_count = 5})
	-- for i = 1, 5 do
	-- 	flow4 = flow3.add({type = 'sprite-button', name = 'cost_' .. i, number = 0})
	-- 	-- flow4.mouse_button_filter = {'middle'}
	-- 	flow4.enabled = false
	-- 	flow4.style.top_margin = -6
	-- 	flow4.style.right_margin = -6
	-- 	flow4.style.maximal_height = 38
	-- 	flow4.visible = false
	-- end
	-- flow3.style.right_margin = -3

	flow2 = flow1.add({
		name = 'silo_frame',
		type = 'frame',
	})
	flow2.style.minimal_width = 80
	flow2.style.natural_width = 80
	flow2.style.minimal_height = 40
	flow2.style.maximal_height = 40
	flow2.style.left_padding = 4
	flow2.style.right_padding = 4
	flow2.style.top_padding = 3

	flow3 = flow2.add({
		name = 'silo_label_1',
		type = 'label',
	})
	flow3.style.font = 'default-large-semibold'
	flow3.style.font_color = GuiCommon.bold_font_color
	flow3.style.right_margin = 2

	flow3 = flow2.add({
		type = 'progressbar',
		name = 'silo_progressbar',
		value = 0,
	})
	flow3.style.top_margin = 9
	flow3.style.right_margin = 2
	flow3.style.width = 72
	flow3.style.height = 11

	flow3 = flow2.add({
		name = 'silo_label_2',
		type = 'label',
	})
	flow3.style.font = 'default-large-semibold'
	flow3.style.right_margin = 2

	flow3 = flow2.add({
		name = 'silo_label_3',
		type = 'label',
	})
	flow3.style.font = 'default-large'
	flow3.style.font_color = GuiCommon.default_font_color
	flow3.style.right_margin = 2

	-- flow3 = flow2.add({
	-- 	type = 'sprite',
	-- 	name = 'silo_charging_indicator',
	-- })
	-- flow3.tooltip = tooltip

	-- old font color: {r=0.33, g=0.66, b=0.9}

	flow2 = flow1.add({
		name = 'quest_frame',
		type = 'frame',
	})
	flow2.style.minimal_width = 80
	flow2.style.natural_width = 80
	flow2.style.minimal_height = 40
	flow2.style.maximal_height = 40
	flow2.style.left_padding = 4
	flow2.style.right_padding = 4
	flow2.style.top_padding = 3

	flow3 = flow2.add({
		name = 'quest_label_1',
		type = 'label',
	})
	flow3.style.font = 'default-large-semibold'
	flow3.style.right_margin = 2

	flow3 = flow2.add({
		name = 'quest_label_2',
		type = 'label',
	})
	flow3.style.font = 'default-large'
	flow3.style.font_color = Common.default_font_color

	flow3 = flow2.add({
		name = 'quest_label_3',
		type = 'label',
	})
	-- flow3.style.font = 'default-large'
	flow3.style.font = 'default-large-semibold'
	flow3.style.left_margin = -4
	flow3.style.right_margin = -4
	flow3.style.font_color = Common.default_font_color

	flow3 = flow2.add({
		name = 'quest_label_4',
		type = 'label',
	})
	flow3.style.font = 'default-large'
	flow3.style.font_color = Common.default_font_color

	flow2 = flow1.add({
		name = 'covering_line_frame',
		type = 'frame',
	})
	flow2.style.minimal_width = 40
	flow2.style.natural_width = 40
	flow2.style.minimal_height = 40
	flow2.style.maximal_height = 40
	flow2.style.left_padding = 3
	flow2.style.right_padding = 3

	flow3 = flow2.add({
		name = 'covering_line',
		type = 'line',
		direction = 'horizontal',
	})
	flow3.style.top_margin = 9
	flow3.style.minimal_width = 320
	flow3.style.maximal_width = 320

	--== SCREEN STUFF

	-- spontaneous inside view of the hold:
	flow1 = player.gui.screen.add({
		type = 'camera',
		name = 'pirates_spontaneous_camera',
		position = { x = 0, y = 0 },
	})
	flow1.visible = false
	flow1.style.margin = 8
	-- flow2.style.minimal_height = 64
	-- flow2.style.minimal_width = 64
	-- flow2.style.maximal_height = 640
	-- flow2.style.maximal_width = 640

	-- flow2 = player.gui.screen.add({
	-- 	name = 'pirates_undock_shortcut_button',
	-- 	type = 'sprite-button',
	-- 	enabled = false,
	-- })
	-- flow2.style.minimal_width = 80
	-- flow2.style.natural_width = 80
	-- flow2.style.maximal_width = 150
	-- flow2.style.minimal_height = 40
	-- flow2.style.maximal_height = 40
	-- flow2.style.left_margin = 1
	-- flow2.style.top_margin = 1
	-- flow2.style.left_padding = 4
	-- flow2.style.right_padding = 4
	-- flow2.style.top_padding = 3
	-- flow2.style.font = 'default-large-semibold'
	-- flow2.style.font_color = GuiCommon.default_font_color
end

function Public.process_etaframe_update(player, flow1, bools)
	if not flow1 then
		return
	end

	local memory = Memory.get_crew_memory()
	local destination = Common.current_destination()
	local dynamic_data = destination.dynamic_data --assumes this always exists

	local flow2

	if
		bools.cost_bool
		or bools.atsea_loading_bool
		or bools.atsea_waiting_bool
		or bools.atsea_victorious_bool
		or bools.eta_bool
		or bools.retreating_bool
		or bools.leave_anytime_bool
	then
		flow1.visible = true

		---@type string|table
		local tooltip = ''

		flow2 = flow1.etaframe_piratebutton_flow_2

		flow2.etaframe_label_1.visible = false --start off
		flow2.etaframe_label_2.visible = false --start off
		flow2.etaframe_label_3.visible = false --start off
		flow2.cost_table.visible = false --start off

		if bools.retreating_bool then
			flow2.etaframe_label_1.visible = true
			flow2.etaframe_label_2.visible = false

			tooltip = { 'pirates.gui_etaframe_board_warning_tooltip' }

			flow2.etaframe_label_1.caption = { 'pirates.gui_etaframe_board_warning' }
		elseif bools.eta_bool then
			flow2.etaframe_label_1.visible = true
			flow2.etaframe_label_2.visible = true

			tooltip = { 'pirates.auto_undock_tooltip' }

			local passive_eta = dynamic_data.time_remaining

			flow2.etaframe_label_1.caption = { 'pirates.gui_etaframe_autoundock' }
			flow2.etaframe_label_2.caption = Utils.standard_string_form_of_time_in_seconds(passive_eta)
		elseif bools.atsea_loading_bool then
			if Kraken.get_active_kraken_count(memory.id) > 0 then
				flow2.etaframe_label_1.visible = true
				flow2.etaframe_label_2.visible = false

				tooltip = { 'pirates.defeat_krakens_tooltip' }

				flow2.etaframe_label_1.caption = { 'pirates.gui_etaframe_defeat_krakens' }
			else
				flow2.etaframe_label_1.visible = true
				flow2.etaframe_label_2.visible = true

				tooltip = { 'pirates.atsea_loading_tooltip' }

				local total = Common.map_loading_ticks_atsea
				if destination.type == Surfaces.enum.DOCK then
					total = Common.map_loading_ticks_atsea_dock
				elseif destination.type == Surfaces.enum.ISLAND and destination.subtype == IslandEnum.enum.MAZE then
					total = Common.map_loading_ticks_atsea_maze
				end

				local eta_ticks = total + (memory.extra_time_at_sea or 0) - memory.loading_ticks

				flow2.etaframe_label_1.caption = { 'pirates.gui_etaframe_loading' }
				flow2.etaframe_label_2.caption = 'for ' .. Utils.standard_string_form_of_time_in_seconds(eta_ticks / 60)
			end
		elseif bools.atsea_waiting_bool then
			flow2.etaframe_label_1.visible = true
			flow2.etaframe_label_2.visible = false

			tooltip = { 'pirates.atsea_waiting_tooltip' }

			if
				memory.proceed_are_you_sure_data
				and memory.proceed_are_you_sure_data[player.index]
				and memory.proceed_are_you_sure_data[player.index] > game.tick - 60 * 4
			then
				flow2.etaframe_label_1.caption = { 'pirates.gui_etaframe_atsea_waiting_are_you_sure' }
			else
				flow2.etaframe_label_1.caption = { 'pirates.gui_etaframe_atsea_waiting' }
			end
		elseif bools.atsea_victorious_bool then
			flow2.etaframe_label_1.visible = true
			flow2.etaframe_label_2.visible = false

			tooltip = { 'pirates.atsea_victorious_tooltip' }

			flow2.etaframe_label_1.caption = { 'pirates.gui_etaframe_atsea_victorious' }
		elseif bools.leave_anytime_bool then
			flow2.etaframe_label_1.visible = true
			flow2.etaframe_label_2.visible = true

			tooltip = { 'pirates.leave_anytime_tooltip' }

			flow2.etaframe_label_1.caption = { 'pirates.gui_etaframe_undock' }
			flow2.etaframe_label_2.caption = { 'pirates.gui_etaframe_anytime' }
		end

		if bools.cost_bool and Kraken.get_active_kraken_count(memory.id) == 0 then
			local costs = destination.static_params.base_cost_to_undock
			local adjusted_costs = Common.time_adjusted_departure_cost(costs)

			local cost_table = flow2.cost_table

			flow2.etaframe_label_3.visible = true
			cost_table.visible = true

			if flow2.etaframe_label_2.visible then
				flow2.etaframe_label_2.caption = flow2.etaframe_label_2.caption .. '.'
			end

			-- local caption
			if bools.atsea_loading_bool then
				flow2.etaframe_label_3.caption = { 'pirates.gui_etaframe_next_escape_cost' }
				if Boats.need_resources_to_undock(Common.overworldx(), destination.subtype) then
					if bools.cost_includes_rocket_launch_bool then
						tooltip = { 'pirates.resources_needed_tooltip_4_rocketvariant' }
					else
						tooltip = { 'pirates.resources_needed_tooltip_4' }
					end
				elseif destination.static_params.undock_cost_decreases == true then
					if bools.cost_includes_rocket_launch_bool then
						tooltip = { 'pirates.resources_needed_tooltip_1_rocketvariant' }
					else
						tooltip = { 'pirates.resources_needed_tooltip_1' }
					end
				else
					if bools.cost_includes_rocket_launch_bool then
						tooltip = { 'pirates.resources_needed_tooltip_0a_rocketvariant' }
					else
						tooltip = { 'pirates.resources_needed_tooltip_0a' }
					end
				end
			elseif not bools.eta_bool then -- Shown when ship doesn't have auto undock timer
				flow2.etaframe_label_3.visible = false
				flow2.etaframe_label_1.visible = true
				flow2.etaframe_label_1.caption = { 'pirates.gui_etaframe_to_escape_store' }

				if bools.cost_includes_rocket_launch_bool then
					tooltip = { 'pirates.resources_needed_tooltip_3_rocketvariant' }
				else
					tooltip = { 'pirates.resources_needed_tooltip_3' }
				end
			else -- Shown when at island
				if Boats.need_resources_to_undock(Common.overworldx(), destination.subtype) then
					flow2.etaframe_label_3.visible = false

					if bools.cost_includes_rocket_launch_bool then
						tooltip = { 'pirates.resources_needed_tooltip_5_rocketvariant' }
					else
						tooltip = { 'pirates.resources_needed_tooltip_5' }
					end
				elseif destination.static_params.undock_cost_decreases == true then
					flow2.etaframe_label_3.caption = { 'pirates.gui_etaframe_or_store' }

					local adjusted_costs_resources_strings =
						Common.time_adjusted_departure_cost_resources_strings(memory)
					if bools.cost_includes_rocket_launch_bool then
						tooltip = {
							'pirates.resources_needed_tooltip_2_rocketvariant',
							adjusted_costs_resources_strings[1],
							adjusted_costs_resources_strings[2],
						}
					else
						--@Future reference: localisation handling
						tooltip = {
							'pirates.resources_needed_tooltip_2',
							adjusted_costs_resources_strings[1],
							adjusted_costs_resources_strings[2],
						}
					end
				else
					if bools.cost_includes_rocket_launch_bool then
						tooltip = { 'pirates.resources_needed_tooltip_3_rocketvariant' }
					else
						tooltip = { 'pirates.resources_needed_tooltip_3' }
					end
				end
			end

			for i = 1, #CoreData.cost_items do
				local item_name = CoreData.cost_items[i].name

				if adjusted_costs[item_name] and cost_table['cost_' .. i] then
					local stored = (memory.boat.stored_resources and memory.boat.stored_resources[item_name]) or 0
					if bools.atsea_loading_bool then
						cost_table['cost_' .. i].number = adjusted_costs[item_name]
					else --subtract off the amount we've stored
						cost_table['cost_' .. i].number = Math.max(adjusted_costs[item_name] - stored, 0)
					end
					cost_table['cost_' .. i].tooltip = CoreData.cost_items[i].display_name
					cost_table['cost_' .. i].visible = true
				else
					cost_table['cost_' .. i].visible = false
				end
			end

			if adjusted_costs['launch_rocket'] and cost_table['cost_launch_rocket'] then
				if bools.atsea_loading_bool or not dynamic_data.rocket_launched then
					cost_table['cost_launch_rocket'].number = 1
				else
					cost_table['cost_launch_rocket'].number = 0
				end
				cost_table['cost_launch_rocket'].tooltip = { 'pirates.gui_etaframe_rocket_requirement_tooltip' }
				cost_table['cost_launch_rocket'].visible = true
			else
				cost_table['cost_launch_rocket'].visible = false
			end
		end

		flow1.etaframe_piratebutton.tooltip = tooltip
		flow2.tooltip = tooltip

		if
			bools.captain_bool
			and not bools.retreating_bool
			and (
				bools.leave_anytime_bool
				or bools.atsea_waiting_bool
				or bools.atsea_victorious_bool
				or bools.eta_bool
				or (bools.cost_bool and not bools.atsea_loading_bool)
			)
		then
			flow1.etaframe_piratebutton.mouse_button_filter = { 'left' }
			if
				memory.undock_shortcut_are_you_sure_data
				and memory.undock_shortcut_are_you_sure_data[player.index]
				and memory.undock_shortcut_are_you_sure_data[player.index] > game.tick - 60 * 4
			then
				flow2.etaframe_label_1.visible = true
				flow2.etaframe_label_1.caption = { 'pirates.gui_etaframe_undock_are_you_sure' }
				flow2.etaframe_label_2.visible = false
				flow2.etaframe_label_3.visible = false
			end
		else
			flow1.etaframe_piratebutton.mouse_button_filter = { 'middle' } --hack to avoid press visual
		end
	else
		flow1.visible = false
	end
end

function Public.process_siloframe_and_questframe_updates(flowsilo, flowquest, bools)
	local destination = Common.current_destination()
	local dynamic_data = destination.dynamic_data --assumes this always exists

	local active_eta
	local flow1

	flow1 = flowsilo
	if flow1 then
		if bools.silo_bool then
			flow1.visible = true

			if bools.charged_bool then
				if bools.launched_bool then
					flow1.silo_progressbar.visible = false

					flow1.silo_label_2.visible = false
					flow1.silo_label_3.visible = true

					-- flow1.silo_label_1.caption = string.format('[achievement=there-is-no-spoon]: +%.0f[item=sulfur]', dynamic_data.rocketcoalreward)
					flow1.silo_label_1.caption = { 'pirates.gui_etaframe_launched' }
					-- flow1.silo_label_1.caption = string.format('Launched for %.0f[item=coal] , ' .. Balance.rocket_launch_coin_reward .. '[item=coin]', dynamic_data.rocketcoalreward)
					flow1.silo_label_1.style.font_color = GuiCommon.achieved_font_color

					local rocket_launch_coal_reward = Balance.rocket_launch_fuel_reward()
					local rocket_launch_coin_reward = Balance.rocket_launch_coin_reward()

					flow1.silo_label_3.caption = Math.floor(rocket_launch_coal_reward / 100) / 10
						.. 'k[item=coal], '
						.. Math.floor(rocket_launch_coin_reward / 100) / 10
						.. 'k[item=coin]'

					local tooltip = { 'pirates.gui_etaframe_launched_tooltip' }
					flow1.tooltip = tooltip
					flow1.silo_label_1.tooltip = tooltip
					flow1.silo_label_3.tooltip = tooltip
				else
					local tooltip = { 'pirates.gui_etaframe_launching' }
					flow1.tooltip = tooltip
					flow1.silo_label_1.tooltip = tooltip
					flow1.silo_progressbar.tooltip = tooltip

					flow1.silo_label_1.caption = { 'pirates.gui_etaframe_charge' }
					flow1.silo_label_1.style.font_color = GuiCommon.bold_font_color
					flow1.silo_label_2.visible = false
					flow1.silo_label_3.visible = false
					flow1.silo_progressbar.visible = true

					flow1.silo_progressbar.value = 1
				end
			else
				flow1.silo_label_1.caption = { 'pirates.gui_etaframe_charge' }
				flow1.silo_label_1.style.font_color = GuiCommon.bold_font_color
				flow1.silo_label_2.visible = true
				flow1.silo_progressbar.visible = true
				flow1.silo_label_3.visible = false

				local consumed = dynamic_data.rocket_silo_energy_consumed
				local needed = dynamic_data.rocket_silo_energy_needed
				local recent = (dynamic_data.rocket_silo_energy_consumed_within_last_half_second * 2)

				flow1.silo_progressbar.value = consumed / needed

				local tooltip = {
					'pirates.gui_etaframe_charge_tooltip',
					string.format('%.1f', Math.floor(consumed / 100000000) / 10),
					string.format('%.1f', Math.floor(needed / 100000000) / 10),
				}
				flow1.tooltip = tooltip
				flow1.silo_label_1.tooltip = tooltip
				flow1.silo_label_2.tooltip = tooltip
				flow1.silo_progressbar.tooltip = tooltip

				if recent ~= 0 then
					active_eta = (needed - consumed) / recent
					flow1.silo_label_2.caption = Utils.standard_string_form_of_time_in_seconds(active_eta)
					if active_eta < dynamic_data.time_remaining or not bools.eta_bool then
						flow1.silo_label_2.style.font_color = GuiCommon.sufficient_font_color
					else
						flow1.silo_label_2.style.font_color = GuiCommon.insufficient_font_color
					end
				else
					flow1.silo_label_2.caption = '∞'
					flow1.silo_label_2.style.font_color = GuiCommon.insufficient_font_color
				end
			end
		else
			flow1.visible = false
		end
	end

	flow1 = flowquest
	if flow1 then
		if bools.quest_bool then
			flow1.visible = true

			local quest_type = dynamic_data.quest_type or nil
			local quest_params = dynamic_data.quest_params or {}
			local quest_reward = dynamic_data.quest_reward or nil
			local quest_progress = dynamic_data.quest_progress or 0
			local quest_progressneeded = dynamic_data.quest_progressneeded or 0
			local quest_complete = dynamic_data.quest_complete or false

			if quest_type then
				---@type string|table
				local tooltip = ''

				if quest_complete and quest_reward then
					tooltip = { 'pirates.gui_questframe_complete_tooltip', quest_type }
					flow1.quest_label_1.caption = { 'pirates.gui_questframe' }
					flow1.quest_label_1.style.font_color = GuiCommon.achieved_font_color
					flow1.quest_label_2.visible = true
					flow1.quest_label_3.visible = false
					flow1.quest_label_4.visible = false
					flow1.quest_label_2.caption = quest_reward.display_amount .. ' ' .. quest_reward.display_sprite
				elseif quest_reward then
					if quest_progress < quest_progressneeded then
						flow1.quest_label_1.caption = { 'pirates.gui_questframe' }
						flow1.quest_label_1.style.font_color = GuiCommon.bold_font_color
						flow1.quest_label_2.visible = true
						flow1.quest_label_3.visible = true
						flow1.quest_label_4.visible = true
						-- defaults, to be overwritten:
						flow1.quest_label_2.caption = string.format('%s ', Quest.quest_icons[quest_type])
						flow1.quest_label_3.caption = string.format('%.0f/%.0f', quest_progress, quest_progressneeded)
						flow1.quest_label_3.style.font_color = GuiCommon.insufficient_font_color
						flow1.quest_label_4.caption = string.format(' for %s', quest_reward.display_sprite)
						flow1.quest_label_4.style.font_color = Common.default_font_color
					end

					if quest_type == Quest.enum.TIME then
						if tooltip == '' then
							tooltip = { 'pirates.gui_questframe_time' }
						end

						if quest_progress >= 0 then
							flow1.quest_label_3.caption =
								string.format('%.0fm%.0fs', Math.floor(quest_progress / 60), quest_progress % 60)
							if active_eta then
								if active_eta < quest_progress - 35 then --35 is roughly the number of seconds between charge and launch
									flow1.quest_label_3.style.font_color = GuiCommon.sufficient_font_color
								else
									flow1.quest_label_3.style.font_color = GuiCommon.insufficient_font_color
								end
							else
								if bools.charged_bool and quest_progress > 35 then
									flow1.quest_label_3.style.font_color = GuiCommon.sufficient_font_color
								else
									flow1.quest_label_3.style.font_color = GuiCommon.insufficient_font_color
								end
							end
						else
							flow1.quest_label_3.caption = { 'pirates.gui_questframe_fail' }
							flow1.quest_label_3.style.font_color = GuiCommon.insufficient_font_color
						end
					elseif quest_type == Quest.enum.WORMS then
						if tooltip == '' then
							tooltip = { 'pirates.gui_questframe_worms' }
						end
					elseif quest_type == Quest.enum.FIND then
						if tooltip == '' then
							tooltip = { 'pirates.gui_questframe_find' }
						end
					elseif quest_type == Quest.enum.RESOURCEFLOW then
						if tooltip == '' then
							tooltip = { 'pirates.gui_questframe_resourceflow' }
						end

						-- out of date:
						if quest_progressneeded / 60 % 1 == 0 then
							flow1.quest_label_2.caption = string.format(
								'%s %.1f/%.0f /s',
								'[item=' .. quest_params.item .. ']',
								quest_progress / 60,
								quest_progressneeded / 60
							)
							flow1.quest_label_3.caption = string.format(' for %s', quest_reward.display_sprite)
						else
							flow1.quest_label_2.caption = string.format(
								'%s %.1f/%.1f /s',
								'[item=' .. quest_params.item .. ']',
								quest_progress / 60,
								quest_progressneeded / 60
							)
							flow1.quest_label_3.caption = string.format(' for %s', quest_reward.display_sprite)
						end
					elseif quest_type == Quest.enum.RESOURCECOUNT then
						if tooltip == '' then
							tooltip = { 'pirates.gui_questframe_resourcecount' }
						end

						flow1.quest_label_2.caption = string.format('%s ', '[item=' .. quest_params.item .. ']')
					elseif quest_type == Quest.enum.NODAMAGE then
						if tooltip == '' then
							tooltip = { 'pirates.gui_questframe_nodamage' }
						end

						if
							bools.approaching_bool
							or (
								dynamic_data.rocketsilos
								and dynamic_data.rocketsilos[1]
								and dynamic_data.rocketsilos[1].valid
								and dynamic_data.rocketsilohp == dynamic_data.rocketsilomaxhp
							)
						then
							flow1.quest_label_3.caption = { 'pirates.gui_questframe_ok' }
							flow1.quest_label_3.style.font_color = GuiCommon.sufficient_font_color
						else
							flow1.quest_label_3.caption = { 'pirates.gui_questframe_fail' }
							flow1.quest_label_3.style.font_color = GuiCommon.insufficient_font_color
						end
					elseif quest_type == Quest.enum.FISH then
						if tooltip == '' then
							tooltip = { 'pirates.gui_questframe_fish' }
						end
					elseif quest_type == Quest.enum.COMPILATRON then
						if tooltip == '' then
							tooltip = { 'pirates.gui_questframe_compilatron' }
						end
					end
				end

				flow1.tooltip = tooltip
				flow1.quest_label_1.tooltip = tooltip
				flow1.quest_label_2.tooltip = tooltip
				flow1.quest_label_3.tooltip = tooltip
				flow1.quest_label_4.tooltip = tooltip
			end
		else
			flow1.visible = false
		end
	end
end

-- local function create_gui_2()

-- end

-- Event.add(defines.events.on_player_joined_game, create_gui_2)

function Public.update_gui(player)
	local memory = Memory.get_crew_memory()
	local destination = Common.current_destination()

	local flow1, flow2

	local pirates_flow = player.gui.top

	if not pirates_flow.info_piratebutton_frame then
		create_gui(player)
	end

	flow1 = pirates_flow.crew_piratebutton_frame.crew_piratebutton

	if Common.is_id_valid(memory.id) then
		flow1.tooltip = { 'pirates.gui_crew_tooltip_1' }
		flow1.mouse_button_filter = { 'left', 'right' }
	else
		flow1.tooltip = { 'pirates.gui_crew_tooltip_2' }
		flow1.mouse_button_filter = { 'middle' } --hack to avoid press visual
		if player.gui.screen['crew_piratewindow'] then
			player.gui.screen['crew_piratewindow'].destroy()
		end
	end

	flow1 = pirates_flow.classes_piratebutton_frame.classes_piratebutton

	if Common.is_id_valid(memory.id) then
		flow1.tooltip = { 'pirates.gui_classes_tooltip_1' }
		flow1.mouse_button_filter = { 'left', 'right' }
	else
		flow1.tooltip = { 'pirates.gui_classes_tooltip_2' }
		flow1.mouse_button_filter = { 'middle' } --hack to avoid press visual
		if player.gui.screen['classes_piratewindow'] then
			player.gui.screen['classes_piratewindow'].destroy()
		end
	end

	if GuiEvo.full_update then
		GuiEvo.full_update(player)
	end
	if GuiProgress.full_update then
		GuiProgress.full_update(player)
	end
	if GuiRuns.full_update then
		GuiRuns.full_update(player)
	end
	if GuiTreasure.full_update then
		GuiTreasure.full_update(player)
	end
	if GuiCrew.full_update then
		GuiCrew.full_update(player)
	end
	if GuiClasses.full_update then
		GuiClasses.full_update(player)
	end
	if GuiMinimap.full_update then
		GuiMinimap.full_update(player)
	end
	if GuiInfo.full_update then
		GuiInfo.full_update(player)
	end

	-- local lives = memory.lives or 1
	-- local button = pirates_flow.lives_piratebutton_frame.lives_piratebutton
	-- if lives == 1 then
	-- 	button.sprite = 'item/efficiency-module'
	-- 	button.number = 1
	-- elseif lives == 2 then
	-- 	button.sprite = 'item/efficiency-module-2'
	-- 	button.number = 2
	-- elseif lives == 3 then
	-- 	button.sprite = 'item/efficiency-module-3'
	-- 	button.number = 3
	-- end

	flow1 = pirates_flow.fuel_flow
	-- flow1 = pirates_flow.fuel_piratebutton_flow_1

	local tooltip = { 'pirates.fuel_tooltip', tostring(Math.floor(memory.stored_fuel or 0)) }
	flow1.tooltip = tooltip
	-- flow1.fuel_piratebutton.tooltip = {'pirates.fuel_tooltip', Math.floor(memory.stored_fuel or 0)}

	flow2 = flow1
	-- flow2 = flow1.fuel_piratebutton_flow_2

	flow2.fuel_label_1.caption = Utils.bignumber_abbrevform(memory.stored_fuel or 0) .. '[item=coal]'
	flow2.fuel_label_2.caption = Utils.negative_rate_abbrevform(memory.fuel_depletion_rate_memoized or 0)
	local color_scale = Math.clamp(0, 1, -(memory.fuel_depletion_rate_memoized or 0) / 30)
	flow2.fuel_label_2.style.font_color = {
		r = GuiCommon.fuel_color_1.r * (1 - color_scale) + GuiCommon.fuel_color_2.r * color_scale,
		g = GuiCommon.fuel_color_1.g * (1 - color_scale) + GuiCommon.fuel_color_2.g * color_scale,
		b = GuiCommon.fuel_color_1.b * (1 - color_scale) + GuiCommon.fuel_color_2.b * color_scale,
	}
	flow2.fuel_label_0.tooltip = tooltip
	flow2.fuel_label_1.tooltip = tooltip
	flow2.fuel_label_2.tooltip = tooltip

	flow1 = pirates_flow.progress_piratebutton_frame.progress_piratebutton

	flow1.number = (memory.overworldx or 0)
	flow1.tooltip = { 'pirates.gui_progress_tooltip', tostring(memory.overworldx or 0), tostring(CoreData.victory_x) }
	-- pirates_flow.destination_piratebutton_frame.destination_piratebutton.number = memory.destinationsvisited_indices and #memory.destinationsvisited_indices or 0

	flow1 = pirates_flow.treasure_piratebutton_frame
	local maps = BuriedTreasure.get_picked_up_treasure_maps()
	flow1.visible = #maps > 0

	flow2 = flow1.treasure_piratebutton
	flow2.tooltip = { 'pirates.gui_treasure_tooltip', #maps }
	flow2.number = #maps

	--== State-checking bools ==--

	-- this is nonsense to temporarily avoid function complexity for luacheck:
	local bools = GuiCommon.player_and_crew_state_bools(player)

	--== Update Gui ==--

	flow1 = pirates_flow.fuel_flow
	-- flow1 = pirates_flow.fuel_piratebutton_flow_1

	if memory.crewstatus == nil then
		flow1.visible = false
	else
		flow1.visible = true
	end

	flow1 = pirates_flow.etaframe_piratebutton_flow_1
	Public.process_etaframe_update(player, flow1, bools)

	-- flow1 = pirates_flow.cost_frame
	-- if flow1 then
	-- 	if bools.cost_bool then
	-- 		flow1.visible = true

	-- 		-- local costs = destination.static_params.base_cost_to_undock

	-- 		-- for i = 1, #CoreData.cost_items do
	-- 		-- 	local item_name = CoreData.cost_items[i].name

	-- 		-- 	if costs[item_name] then
	-- 		-- 		local stored = (memory.boat.stored_resources and memory.boat.stored_resources[item_name]) or 0
	-- 		-- 		flow1.cost_table['cost_' .. i].sprite = CoreData.cost_items[i].sprite_name
	-- 		-- 		flow1.cost_table['cost_' .. i].number = Math.max(costs[item_name] - stored, 0)
	-- 		-- 		flow1.cost_table['cost_' .. i].tooltip = CoreData.cost_items[i].display_name
	-- 		-- 		flow1.cost_table['cost_' .. i].visible = true
	-- 		-- 	else
	-- 		-- 		flow1.cost_table['cost_' .. i].visible = false
	-- 		-- 	end
	-- 		-- end

	-- 		-- local total_rage = time_rage + silo_rage

	-- 		-- flow1.rage_label_2.caption = total_rage .. '/10'
	-- 		-- if total_rage <= 4 then
	-- 		-- 	flow1.rage_label_2.style.font_color = GuiCommon.rage_font_color_1
	-- 		-- 	flow1.rage_label_2.style.font = 'default-large'
	-- 		-- elseif total_rage <= 7 then
	-- 		-- 	flow1.rage_label_2.style.font_color = GuiCommon.rage_font_color_2
	-- 		-- 	flow1.rage_label_2.style.font = 'default-large-semibold'
	-- 		-- else
	-- 		-- 	flow1.rage_label_2.style.font_color = GuiCommon.rage_font_color_3
	-- 		-- 	flow1.rage_label_2.style.font = 'default-dialog-button'
	-- 		-- end

	-- 		-- -- flow1.rage_table.bar_1.value = time_rage >= 1 and 1 or 0
	-- 		-- -- flow1.rage_table.bar_2.value = time_rage >= 2 and 1 or 0
	-- 		-- -- flow1.rage_table.bar_3.value = time_rage >= 3 and 1 or 0
	-- 		-- -- flow1.rage_table.bar_4.value = time_rage >= 4 and 1 or 0
	-- 		-- -- flow1.rage_table.bar_5.value = silo_rage >= 1 and 1 or 0
	-- 		-- -- flow1.rage_table.bar_6.value = silo_rage >= 2 and 1 or 0
	-- 	else
	-- 		flow1.visible = false
	-- 	end
	-- end

	-- flow1 = player.gui.screen.pirates_undock_shortcut_button

	-- if flow1 then
	-- 	flow1.location = GuiCommon.default_window_positions.undock_shortcut_button
	-- 	if bools.captain_bool and bools.landed_bool and (not memory.captain_acceptance_timer) then
	-- 		flow1.visible = true
	-- 		local enabled = Common.query_can_pay_cost_to_leave()
	-- 		flow1.enabled = enabled
	-- 		if enabled then
	-- 			flow1.tooltip = ''
	-- 		else
	-- 			flow1.tooltip = 'Store more resources in the captain\'s cabin before leaving.'
	-- 		end
	-- 	elseif bools.captain_bool and destination and destination.type and destination.type == Surfaces.enum.DOCK and (not (memory.boat.state and memory.boat.state == Boats.enum_state.LEAVING_DOCK)) then
	-- 		flow1.visible = true
	-- 		flow1.enabled = memory.boat and memory.boat.state and memory.boat.state == Boats.enum_state.DOCKED
	-- 		flow1.tooltip = ''
	-- 	else
	-- 		flow1.visible = false
	-- 	end

	-- 	if flow1.visible then
	-- 		if (not memory.undock_shortcut_are_you_sure_data) then memory.undock_shortcut_are_you_sure_data = {} end
	-- 		if memory.undock_shortcut_are_you_sure_data[player.index] and memory.undock_shortcut_are_you_sure_data[player.index] > game.tick - 60 * 4 then
	-- 			flow1.caption = 'Are you sure?'
	-- 		else
	-- 			flow1.caption = 'Undock'
	-- 		end
	-- 	end
	-- end

	local flowsilo = pirates_flow.silo_frame
	local flowquest = pirates_flow.quest_frame
	Public.process_siloframe_and_questframe_updates(flowsilo, flowquest, bools)

	flow1 = pirates_flow.covering_line_frame

	if flow1 then
		-- if not bools.eta_bool and not bools.retreating_bool and not bools.quest_bool and not bools.silo_bool and not bools.atsea_loading_bool and not bools.leave_anytime_bool and not bools.cost_bool and not bools.approaching_dock_bool and not bools.leaving_dock_bool then
		if
			not (
				bools.eta_bool
				or bools.retreating_bool
				or bools.quest_bool
				or bools.silo_bool
				or bools.atsea_loading_bool
				or bools.leave_anytime_bool
				or bools.cost_bool
				or bools.approaching_dock_bool
				or bools.leaving_dock_bool
				or bools.atsea_sailing_bool
				or bools.atsea_waiting_bool
				or bools.atsea_victorious_bool
			)
		then
			flow1.visible = true
		else
			flow1.visible = false
		end
	end

	flow1 = pirates_flow.minimap_piratebutton_frame

	if flow1 then
		if bools.in_hold_bool or bools.in_cabin_bool then
			flow1.visible = true
		else
			flow1.visible = false
		end
	end

	flow1 = player.gui.screen.pirates_spontaneous_camera

	if not flow1 then --comfy panel might possibly destroy this, so this puts it back
		flow1 = player.gui.screen.add({
			type = 'camera',
			name = 'pirates_spontaneous_camera',
			position = { x = 0, y = 0 },
		})
		flow1.visible = false
		flow1.style.margin = 8
	end

	if flow1 then
		flow1.visible = false
		flow1.location = { x = 8, y = 48 }
		if bools.on_deck_standing_near_loco_bool then
			flow1.visible = true
			flow1.surface_index = Hold.get_hold_surface(1).index
			flow1.zoom = 0.182
			flow1.style.minimal_height = 292
			flow1.style.minimal_width = 540
			flow1.position = { x = 0, y = -2 }
		elseif bools.on_deck_standing_near_cabin_bool then
			flow1.visible = true
			flow1.surface_index = Cabin.get_cabin_surface().index
			flow1.zoom = 0.468
			flow1.style.minimal_height = 400
			flow1.style.minimal_width = 280
			flow1.position = { x = 0, y = -1 }
		elseif bools.on_deck_standing_near_crowsnest_bool then
			flow1.visible = true
			flow1.surface_index = Crowsnest.get_crowsnest_surface().index
			flow1.zoom = 0.21
			flow1.style.minimal_height = 384
			flow1.style.minimal_width = 384
			flow1.position = { x = memory.overworldx, y = memory.overworldy }
		elseif bools.in_crowsnest_bool then
			flow1.visible = true
			flow1.surface_index = game.surfaces[memory.boat.surface_name].index
			flow1.zoom = 0.09
			flow1.style.minimal_height = 312
			flow1.style.minimal_width = 312

			local position = memory.boat.position
			if
				destination
				and destination.type
				and destination.type == Surfaces.enum.ISLAND
				and memory.boat.surface_name
				and memory.boat.surface_name == destination.surface_name
				and destination.static_params
				and destination.static_params.boat_starting_xposition
			then
				-- nicer viewing position:
				position = {
					x = destination.static_params.boat_starting_xposition + 50,
					y = destination.static_params.boat_starting_yposition or 0,
				}
			end
			flow1.position = position
		end
	end
end

-- ATTENTION: Giving same names to GUI elements can cause issues, because click events are dispatched to all GUI windows!
local function on_gui_click(event)
	if not event then
		return
	end
	if not event.element then
		return
	end
	if not event.element.valid then
		return
	end

	local player = game.players[event.element.player_index]

	local crew_id = Common.get_id_from_force_name(player.force.name)
	Memory.set_working_id(crew_id)
	local memory = Memory.get_crew_memory()

	if event.element.name and event.element.name == 'etaframe_piratebutton' then
		if memory.boat.state == Boats.enum_state.DOCKED or memory.boat.state == Boats.enum_state.LANDED then
			if Permissions.player_privilege_level(player) >= Permissions.privilege_levels.CAPTAIN then
				if not memory.undock_shortcut_are_you_sure_data then
					memory.undock_shortcut_are_you_sure_data = {}
				end
				if
					memory.undock_shortcut_are_you_sure_data[player.index]
					and memory.undock_shortcut_are_you_sure_data[player.index] > game.tick - 60 * 4
				then
					if memory.boat.state == Boats.enum_state.DOCKED then
						Progression.undock_from_dock(true)
					elseif memory.boat.state == Boats.enum_state.LANDED then
						Progression.try_retreat_from_island(player, true)
					end
				else
					memory.undock_shortcut_are_you_sure_data[player.index] = game.tick
				end
			end
		elseif memory.boat.state == Boats.enum_state.ATSEA_WAITING_TO_SAIL then
			if Permissions.player_privilege_level(player) >= Permissions.privilege_levels.CAPTAIN then
				if not memory.proceed_are_you_sure_data then
					memory.proceed_are_you_sure_data = {}
				end
				if
					memory.proceed_are_you_sure_data[player.index]
					and memory.proceed_are_you_sure_data[player.index] > game.tick - 60 * 4
				then
					local destination_index = memory.map_being_loaded_destination_index

					Progression.progress_to_destination(destination_index)
				else
					memory.proceed_are_you_sure_data[player.index] = game.tick
				end
			end
		elseif memory.boat.state == Boats.enum_state.ATSEA_VICTORIOUS then
			if Permissions.player_privilege_level(player) >= Permissions.privilege_levels.CAPTAIN then
				memory.boat.state = Boats.enum_state.ATSEA_SAILING

				local force = memory.force
				if not (force and force.valid) then
					return
				end
				if memory.victory_continue_message then
					memory.victory_continue_message = false
					Common.notify_force(force, { 'pirates.crew_continue_on_freeplay' }, CoreData.colors.notify_victory)
				end
			end
		end
	elseif string.sub(event.element.name, -13, -1) and string.sub(event.element.name, -13, -1) == '_piratebutton' then
		local name = string.sub(event.element.name, 1, -14)
		if Public[name] then
			Public[name].toggle_window(player)
			Public[name].full_update(player)
		end
		-- elseif event.element.name == 'fuel_label_1' or event.element.name == 'fuel_label_2' then
		-- 	Public.fuel.toggle_window(player)
		-- 	Public.fuel.full_update(player)
	else
		if GuiWelcome.handle_click then
			GuiWelcome.handle_click(event)
		end
		if GuiRuns.click then
			GuiRuns.click(event)
		end
		if GuiCrew.click then
			GuiCrew.click(event)
		end
		if GuiClasses.click then
			GuiClasses.click(event)
		end
		if GuiMinimap.click then
			GuiMinimap.click(event)
		end
		if GuiInfo.click then
			GuiInfo.click(event)
		end
		if GuiTreasure.click then
			GuiTreasure.click(event)
		end
	end
end

local function on_gui_location_changed(event)
	if not event and event.element and event.element.valid then
		return
	end

	if string.sub(event.element.name, -13, -1) and string.sub(event.element.name, -13, -1) == '_piratewindow' then
		local name = string.sub(event.element.name, 1, -14)
		local player = game.players[event.element.player_index]

		GuiCommon.update_gui_memory(player, name, 'position', event.element.location)
	end
end

local event = require('utils.event')
event.add(defines.events.on_gui_click, on_gui_click)
event.add(defines.events.on_gui_location_changed, on_gui_location_changed)

return Public
