-- 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 Common = require('maps.pirates.common')
local Balance = require('maps.pirates.balance')
-- local Utils = require 'maps.pirates.utils_local'
-- local Math = require 'maps.pirates.math'
local _inspect = require('utils.inspect').inspect
local Boats = require('maps.pirates.structures.boats.boats')
local Memory = require('maps.pirates.memory')
local Kraken = require('maps.pirates.surfaces.sea.kraken')
local Public = {}

-- local GuiCommon = require 'maps.pirates.gui.common'

-- local button_sprites = {
-- 	['small-biter'] = 0,
-- 	['medium-biter'] = 0.2,
-- 	['small-spitter'] = 0.25,
-- 	['medium-spitter'] = 0.4,
-- 	['big-spitter'] = 0.5,
-- 	['big-biter'] = 0.501,
-- 	['behemoth-spitter'] = 0.9,
-- 	['behemoth-biter'] = 0.901
-- }

-- local function get_alien_name(evolution_factor)
-- 	local last_match = 'fish'
-- 	for name, alien_threshold in pairs(button_sprites) do
-- 		if evolution_factor == alien_threshold then
-- 			return name
-- 		end

-- 		-- next alien evolution_factor isn't reached
-- 		if alien_threshold > evolution_factor then
-- 			return last_match
-- 		end

-- 		-- surpassed this alien evolution_factor
-- 		if alien_threshold < evolution_factor then
-- 			last_match = name
-- 		end
-- 	end

-- 	return last_match
-- end

-- function Public.regular_update(player)

-- end

function Public.full_update(player)
	if Public.regular_update then
		Public.regular_update(player)
	end

	local memory = Memory.get_crew_memory()
	local pirates_flow = player.gui.top

	local button = pirates_flow.evo_piratebutton_frame.evo_piratebutton
	if button and button.valid then
		local evo = memory.evolution_factor or 0
		-- local evo = Math.floor(evo * 1000) * 0.001
		-- local current_alien = get_alien_name(evolution_factor)
		-- local sprite = 'entity/' .. current_alien

		-- if evolution_factor == 0 or (memory.boat and (memory.boat.state == Boats.enum_state.ATSEA_SAILING or memory.boat.state == Boats.enum_state.ATSEA_LOADING_MAP)) then
		-- 	button.number = 0
		-- 	button.tooltip = 'Local biter evolution\n\n0'
		-- else

		local destination = Common.current_destination()

		local evolution_leagues = 0
		local evolution_kraken = 0
		local evolution_time = 0
		local evolution_silo = 0
		local evolution_nests = 0
		local evolution_sandwurms = 0
		local evolution_total

		local types = { 'leagues', 'kraken', 'time', 'silo', 'nests', 'sandwurms' }

		if Boats.is_boat_at_sea() then
			local krakens = false
			if memory.active_sea_enemies and memory.active_sea_enemies.krakens then
				for i = 1, Kraken.kraken_slots do
					if memory.active_sea_enemies.krakens[i] then
						krakens = true
						break
					end
				end
			end
			if krakens then
				evolution_leagues = evo - (memory.dynamic_kraken_evo or 0)
				evolution_kraken = Balance.kraken_static_evo + (memory.dynamic_kraken_evo or 0)
				evolution_total = evo + Balance.kraken_static_evo
			else
				evolution_leagues = evo
				evolution_total = evo
			end
		else
			if destination and destination.dynamic_data then
				evolution_leagues = destination.dynamic_data.evolution_accrued_leagues
				evolution_time = destination.dynamic_data.evolution_accrued_time
				evolution_nests = destination.dynamic_data.evolution_accrued_nests
				evolution_silo = destination.dynamic_data.evolution_accrued_silo
				evolution_sandwurms = destination.dynamic_data.evolution_accrued_sandwurms
			end
			evolution_total = (evolution_leagues or 0)
				+ (evolution_time or 0)
				+ (evolution_nests or 0)
				+ (evolution_silo or 0)
				+ (evolution_sandwurms or 0)
				+ (evolution_kraken or 0)
		end

		---@type (string|table)[]
		local str = { '', { 'pirates.gui_evo_tooltip_1', string.format('%.2f', evolution_total) } }

		if evolution_leagues or evolution_time or evolution_nests or evolution_silo or evolution_sandwurms then
			str[#str + 1] = { '', '\n' }
		end

		for _, type in ipairs(types) do
			if type == 'leagues' then
				if evolution_leagues then
					str[#str + 1] =
						{ '', '\n', { 'pirates.gui_evo_tooltip_2', string.format('%.2f', evolution_leagues) } }
				end
			elseif type == 'kraken' then
				if evolution_kraken then
					str[#str + 1] =
						{ '', '\n', { 'pirates.gui_evo_tooltip_3', string.format('%.2f', evolution_kraken) } }
				end
			elseif type == 'time' then
				if evolution_time then
					str[#str + 1] = { '', '\n', { 'pirates.gui_evo_tooltip_4', string.format('%.2f', evolution_time) } }
				end
			elseif type == 'silo' then
				if evolution_silo then
					str[#str + 1] = { '', '\n', { 'pirates.gui_evo_tooltip_5', string.format('%.2f', evolution_silo) } }
				end
			elseif type == 'nests' then
				if evolution_nests then
					str[#str + 1] =
						{ '', '\n', { 'pirates.gui_evo_tooltip_6', string.format('%.2f', evolution_nests) } }
				end
			elseif type == 'sandwurms' then
				if evolution_sandwurms then
					str[#str + 1] =
						{ '', '\n', { 'pirates.gui_evo_tooltip_7', string.format('%.2f', evolution_sandwurms) } }
				end
			end
		end

		button.number = evolution_total
		button.tooltip = str

		if evolution_total > 1.0 then
			button.sprite = 'entity/behemoth-worm-turret'
		elseif evolution_total >= 0.9 then
			button.sprite = 'entity/behemoth-biter'
		elseif evolution_total >= 0.5 then
			button.sprite = 'entity/big-biter'
		elseif evolution_total >= 0.4 then
			button.sprite = 'entity/medium-spitter'
		elseif evolution_total >= 0.25 then
			button.sprite = 'entity/small-spitter'
		elseif evolution_total >= 0.2 then
			button.sprite = 'entity/medium-biter'
		else
			button.sprite = 'entity/small-biter'
		end
	end
end

return Public
