-- Immediate Mode Profile
-- Tests immediate mode where UI recreates each frame

local FlexLove = require("FlexLove")

local profile = {
  elementCount = 50,
  maxElements = 300,
  minElements = 10,
  frameCount = 0,
}

function profile.init()
  FlexLove.init({
    width = love.graphics.getWidth(),
    height = love.graphics.getHeight(),
    immediateMode = true,
  })
end

function profile.buildUI()
  -- In immediate mode, we recreate the UI every frame
  local root = FlexLove.new({
    id = "root", -- ID required for state persistence
    width = "100%",
    height = "100%",
    backgroundColor = FlexLove.Color.new(0.05, 0.05, 0.1, 1),
    positioning = "flex",
    flexDirection = "vertical",
    overflowY = "scroll",
    padding = { horizontal = 20, vertical = 20 },
    gap = 10,
  })

  -- Dynamic content container
  local content = FlexLove.new({
    id = "content",
    width = "100%",
    positioning = "flex",
    flexDirection = "horizontal",
    flexWrap = "wrap",
    gap = 5,
    marginBottom = 20,
  })

  for i = 1, profile.elementCount do
    local hue = (i / profile.elementCount) * 360
    local baseColor = FlexLove.Color.new(
      0.3 + 0.5 * math.sin(hue * math.pi / 180),
      0.3 + 0.5 * math.sin((hue + 120) * math.pi / 180),
      0.3 + 0.5 * math.sin((hue + 240) * math.pi / 180),
      1
    )

    -- Each element needs a unique ID for state persistence
    local box = FlexLove.new({
      id = string.format("box_%d", i),
      width = 60,
      height = 60,
      backgroundColor = baseColor,
      borderRadius = 8,
      margin = { horizontal = 2, vertical = 2 },
      onEvent = function(element, event)
        if event.type == "hover" then
          element.backgroundColor = FlexLove.Color.new(
            math.min(1, baseColor.r * 1.3),
            math.min(1, baseColor.g * 1.3),
            math.min(1, baseColor.b * 1.3),
            1
          )
        elseif event.type == "unhover" then
          element.backgroundColor = baseColor
        elseif event.type == "press" then
          element.borderRadius = 15
        elseif event.type == "release" then
          element.borderRadius = 8
        end
      end,
    })

    content:addChild(box)
  end

  root:addChild(content)

  -- Info panel (also recreated each frame)
  local infoPanel = FlexLove.new({
    id = "infoPanel",
    width = "100%",
    padding = { horizontal = 15, vertical = 15 },
    backgroundColor = FlexLove.Color.new(0.1, 0.1, 0.2, 0.9),
    borderRadius = 8,
    positioning = "flex",
    flexDirection = "vertical",
    gap = 5,
  })

  infoPanel:addChild(FlexLove.new({
    id = "info_title",
    text = string.format("Immediate Mode: %d Elements", profile.elementCount),
    fontSize = 18,
    textColor = FlexLove.Color.new(1, 1, 1, 1),
  }))

  infoPanel:addChild(FlexLove.new({
    id = "info_frame",
    text = string.format("Frame: %d", profile.frameCount),
    fontSize = 14,
    textColor = FlexLove.Color.new(0.8, 0.8, 0.8, 1),
  }))

  infoPanel:addChild(FlexLove.new({
    id = "info_states",
    text = string.format("Active States: %d", FlexLove.getStateCount()),
    fontSize = 14,
    textColor = FlexLove.Color.new(0.8, 0.8, 0.8, 1),
  }))

  infoPanel:addChild(FlexLove.new({
    id = "info_help",
    text = "Press +/- to adjust element count",
    fontSize = 12,
    textColor = FlexLove.Color.new(0.7, 0.7, 0.7, 1),
  }))

  root:addChild(infoPanel)

  return root
end

function profile.update(dt)
  profile.frameCount = profile.frameCount + 1
end

function profile.draw()
  -- Immediate mode: rebuild UI every frame
  FlexLove.beginFrame()
  local root = profile.buildUI()
  FlexLove.endFrame()

  -- Draw the UI
  if root then
    root:draw()
  end

  -- Overlay info
  love.graphics.setColor(1, 1, 1, 1)
  love.graphics.print("Immediate Mode Stress Test", 10, love.graphics.getHeight() - 120)
  love.graphics.print(
    string.format("Elements: %d | Range: %d-%d",
      profile.elementCount,
      profile.minElements,
      profile.maxElements
    ),
    10,
    love.graphics.getHeight() - 100
  )
  love.graphics.print(
    string.format("Frames: %d | States: %d",
      profile.frameCount,
      FlexLove.getStateCount()
    ),
    10,
    love.graphics.getHeight() - 80
  )
  love.graphics.print("Press + to add 10 elements", 10, love.graphics.getHeight() - 60)
  love.graphics.print("Press - to remove 10 elements", 10, love.graphics.getHeight() - 45)
end

function profile.keypressed(key)
  if key == "=" or key == "+" then
    profile.elementCount = math.min(profile.maxElements, profile.elementCount + 10)
  elseif key == "-" or key == "_" then
    profile.elementCount = math.max(profile.minElements, profile.elementCount - 10)
  end
end

function profile.resize(w, h)
  FlexLove.resize(w, h)
end

function profile.reset()
  profile.elementCount = 50
  profile.frameCount = 0
  FlexLove.clearAllStates()
end

function profile.cleanup()
  FlexLove.clearAllStates()
end

return profile
