--[[
  RequestHandler是当一名Player收到Request信息时，创建的数据结构。
  根据Player是由真人控制还是由Bot控制，该数据可能创建于客户端或者服务端。

  内容：
  * 一个Scene对象，保存着在答复该Request时，界面上所有的可操作要素
  * Player与currentRoom
  * setup(): 初始化函数

  当RequestHandler创建于客户端时，其还负责与实际显示出的UI进行通信。为了与实际
  界面进行通信，需要额外的方法与数据：

  * notifyUI(): 向qml发送所有与UI更新有关的信息
  * update(): Qml向Lua发送UI事件后，这里做出相关的处理，
              一般最后通过notifyUI反馈更新信息
  * self.change: 一次update中，产生的UI变化；设置这个的目的是当notifyUI时
              减少信息量，只将状态发生改变的元素发回客户端
  (*) 在QML中需定义applyChange函数以接收来自Lua的更改

  当RequestHandler创建于服务端时，因为并没有实际的界面，所以上述三个方法无用，
  此时与RequestHandler进行交互的就是AI逻辑代码；这些就留到以后讨论了。
--]]
--@field public data any 相关数据，需要子类自行定义一个类或者模拟类

-- 关于self.change:
-- * _new: 新创建的Item，一开始的时候UI上没显示它们
-- * _delete: 删除新创建的Item
-- * _prompt: 提示信息。实践证明prompt值得单开一个key
-- * _misc: 其他乱七八糟的需要告诉UI的信息
-- * Item类名：这类Item中某个Item发生的信息变动，change的主体部分

---@class RequestHandler: Object
---@field public room AbstractRoom
---@field public scene Scene
---@field public player Player 需要应答的玩家
---@field public prompt string 提示信息
---@field public change { [string]: Item[] } 将会传递给UI的更新数据
local RequestHandler = class("RequestHandler")

function RequestHandler:initialize(player, data)
  self.room = Fk:currentRoom()
  self.player = player
  -- finish只在Client执行 用于保证UI执行了某些必须执行的善后
  if ClientInstance and ClientInstance.current_request_handler then
    ClientInstance.current_request_handler:_finish()
  end
  self.room.current_request_handler = self
end

-- 进入Request之后需要做的第一步操作，对应之前UI代码中state变换
function RequestHandler:setup() end

function RequestHandler:_finish()
  if not self.finished then
    self.finished = true
    self.change = {}
    self:finish()
    self.scene:notifyUI()
  end
end

-- 因为发送答复或者超时等原因导致UI进入notactive状态时调用。
-- 只会由UI调用且只执行一次；意义主要在于清除那些传给了UI的半路新建的对象
function RequestHandler:finish() end

-- 产生UI事件后由UI触发
-- 需要实现各种合法性检验，决定需要变更状态的UI，并最终将变更反馈给真实的界面
---@param elemType string
---@param id string | integer
---@param action string
---@param data any
function RequestHandler:update(elemType, id, action, data) end

function RequestHandler:setPrompt(str)
  if not self.change then return end
  self.prompt = str
  self.change["_prompt"] = str
end

return RequestHandler
