--=================================== TALK With NPC UI====================================--
--HIỆN BẢNG THÔNG BÁO NỘI DUNG NÓI CHUYỆN VỚI NPC - CỬA SỔ NHỎ GIỮA MÀN HÌNH
--CÓ NÚT TƯƠNG TÁC NHIỆM VỤ: Trả vật phẩm quest
    --CALL FUNCTION: VLF.QuestUI.NPCInteractionWindow(player, qStep, text, width, height, zNPC)
--========================================================================================--
--CÁCH HOẠT ĐỘNG:
    --Xử lý các dữ liệu của quest rồi gọi VLF.QuestUI.NPCInteractionWindow(player, qStep, getText("IGUI_VLQ_Event_freeNPC", textReqItemNum, reqItemName), 800, 700, zNPC)
        --modData: text các nút bấm, text khi talk
    --VLINTER.SetButtons[qStep] = function(player, qStep, buttonList)		--func xác định các nút nào được hiển thị. qStep sẽ phải giống với qStep của NPC đang tương tác
    --VLINTER.Rewards[qStep] = function(player, qStep, args)   --func xác định các phần thưởng. 1 đến 3 phần thưởng. 3 phần thưởng thì hiện 3 nút

--========================================================================================--

require "ISUI/ISPanelJoypad"
require "ISUI/ISUIElement"
require "ISUI/ISPanel"
require "ISUI/ISButton"
require "ISUI/ISScrollingListBox"

VL_Quest_TalkToNPC_Interaction_UI = ISPanel:derive("VL_Quest_TalkToNPC_Interaction_UI")

local SplitTextByLength = VLF.SplitTextByLength
local GetPlayerGlobalModDataQ1 = VLGMD.GetPlayerGlobalModDataQ1
local GetPlayerGlobalModData = VLGMD.GetPlayerGlobalModData
local GetPlayerGlobalModDataEvent = VLGMD.GetPlayerGlobalModDataEvent
local Caldistance = VLF.Caldistance

--Xác định các nút hiển thị tùy từng sự kiện
--call function: VLINTER.SetButtons[qStep]
local function ActivateVisibleButtons(player, qStep)
    local buttonList = {
        ["interactionButton1"] = false,
        ["interactionButton2"] = false,
        ["interactionButton3"] = false,
        ["interactionButton4"] = false,
        ["interactionButton5"] = false,
        ["rewardButton1"] = false,     --loại nút trả thưởng 1
        ["rewardButton2"] = false,     --loại nút trả thưởng 2
        ["rewardButton3"] = false,     --loại nút trả thưởng 3
    }
    
    local playerGMD_Quest_Q1 = GetPlayerGlobalModDataQ1(player, qStep)
        
    local playerGMD_Event = GetPlayerGlobalModDataEvent(player, qStep)
    if string.find(qStep, "freeNPC_") then
        if playerGMD_Event[qStep]["isQCreated"] == true then    --đảm bảo không nhầm với các qStep cũng đặt tên có text freeNPC_
            --Tất cả freeNPC sử dụng chung 1 function   VLINTER.SetButtons["freeNPC"]
            VLINTER.SetButtons["freeNPC"](player, qStep, buttonList)
        end
    else
        --NPC trong các questline thì check qStep trong playerGMD.Quest
        local playerGMD = GetPlayerGlobalModData(player)
        local stopLoop = false
        for _, data in pairs(playerGMD.Quest) do
            for _qStep, _data in pairs(data) do
                if _qStep == qStep then
                    VLINTER.SetButtons[qStep](player, qStep, buttonList)
                    stopLoop = true
                    break
                end
            end
            if stopLoop == true then
                break
            end
        end
        
        --[[
        local playerGMD_Event = GetPlayerGlobalModDataEvent(player, qStep)
        for _qStep, data in pairs(playerGMD_Event) do
            if _qStep == qStep then
                VLINTER.SetButtons[qStep](player, qStep, buttonList)
            end
        end
        ]]
    end
    
    --print("Client---SetButtons= ", buttonList.interactionButton3, buttonList.interactionButton1, buttonList.interactionButton2, buttonList.rewardButton1, buttonList.rewardButton2, buttonList.rewardButton3)
    return buttonList
end

function VL_Quest_TalkToNPC_Interaction_UI:new(player, qStep, text, x, y, width, height, zNPC)
    local o = ISPanel.new(self, x, y, width, height)
    o.player = player
    o.qStep = qStep
    o.zNPC = zNPC
    o.text = text or "nothing!"
    o.isAddTexture = isAddTexture
    o.texture = texture
    o.moveWithMouse = false
    o.backgroundColor = {r=0, g=0, b=0, a=0.7}
    o.borderColor = {r=1, g=1, b=1, a=1}
    o:setAlwaysOnTop(true)
    o.keepOnScreen = true
    o:setWantKeyEvents(true)
    return o
end

function VL_Quest_TalkToNPC_Interaction_UI:initialise()
    ISPanel.initialise(self)

    -- Nút Xác nhận đóng cửa sổ. Luôn luôn hiển thị
    local space = 10
    local btnW, btnH = 100, 45
    local btnX = (self.width - btnW) / 2
    local btnY = self.height - btnH - space
    
    self.okBtn = ISButton:new(btnX, btnY, btnW, btnH, getText("IGUI_VLQ_Confirm"), self, VL_Quest_TalkToNPC_Interaction_UI.onConfirm)
    self.okBtn.font = UIFont.NewMedium
    self.okBtn:initialise()
    self.okBtn:instantiate()
    self.okBtn.borderColor = {r=1, g=1, b=1, a=0.7}
    self:addChild(self.okBtn)
    
    --kiểm tra có bao nhiêu nút hiển thị để sắp xếp vị trí các Nút
    --Mỗi nút 1 dòng. Tăng giảm chiều cao của scolllist phụ thuộc vào số lượng nút
    local buttonList = ActivateVisibleButtons(self.player, self.qStep)
    local qStep = self.qStep
    local player = self.player
    
    --Nút tương tác --interactionButton1
    if buttonList.interactionButton1 and buttonList.interactionButton1 == true then
        btnY = btnY - btnH - space
        btnW = getTextManager():MeasureStringX(UIFont.NewSmall, getText("IGUI_VLQ_InteractionBtn1Label_" .. qStep)) + 10
        btnX = (self.width - btnW) / 2
        
        self.interactionBtn = ISButton:new(btnX, btnY, btnW, btnH, getText("IGUI_VLQ_InteractionBtn1Label_" .. qStep), self, VL_Quest_TalkToNPC_Interaction_UI.onInteractionBtn1)
        self.interactionBtn.font = UIFont.NewSmall
        self.interactionBtn:initialise()
        self.interactionBtn:instantiate()
        self.interactionBtn.borderColor = {r=1, g=1, b=1, a=0.7}
        self.interactionBtn.qStep = qStep
        self.interactionBtn.player = player
        self.interactionBtn.zNPC = zNPC
        self:addChild(self.interactionBtn)
    end
    
    --Nút tương tác --interactionButton2
    if buttonList.interactionButton2 and buttonList.interactionButton2 == true then
        btnY = btnY - btnH - space
        btnW = getTextManager():MeasureStringX(UIFont.NewSmall, getText("IGUI_VLQ_InteractionBtn2Label_" .. qStep)) + 10
        btnX = (self.width - btnW) / 2
        
        self.interactionBtn = ISButton:new(btnX, btnY, btnW, btnH, getText("IGUI_VLQ_InteractionBtn2Label_" .. qStep), self, VL_Quest_TalkToNPC_Interaction_UI.onInteractionBtn2)
        self.interactionBtn.font = UIFont.NewSmall
        self.interactionBtn:initialise()
        self.interactionBtn:instantiate()
        self.interactionBtn.borderColor = {r=1, g=1, b=1, a=0.7}
        self.interactionBtn.qStep = qStep
        self.interactionBtn.player = player
        self.interactionBtn.zNPC = zNPC
        self:addChild(self.interactionBtn)
    end
    
    --Nút tương tác --interactionButton3
    if buttonList.interactionButton3 and buttonList.interactionButton3 == true then
        btnY = btnY - btnH - space
        btnW = getTextManager():MeasureStringX(UIFont.NewSmall, getText("IGUI_VLQ_InteractionBtn3Label_" .. qStep)) + 10
        btnX = (self.width - btnW) / 2
        
        self.interactionBtn = ISButton:new(btnX, btnY, btnW, btnH, getText("IGUI_VLQ_InteractionBtn3Label_" .. qStep), self, VL_Quest_TalkToNPC_Interaction_UI.onInteractionBtn3)
        self.interactionBtn.font = UIFont.NewSmall
        self.interactionBtn:initialise()
        self.interactionBtn:instantiate()
        self.interactionBtn.borderColor = {r=1, g=1, b=1, a=0.7}
        self.interactionBtn.qStep = qStep
        self.interactionBtn.player = player
        self.interactionBtn.zNPC = zNPC
        self:addChild(self.interactionBtn)
    end
    
    --Nút tương tác --interactionButton4
    if buttonList.interactionButton4 and buttonList.interactionButton4 == true then
        btnY = btnY - btnH - space
        btnW = getTextManager():MeasureStringX(UIFont.NewSmall, getText("IGUI_VLQ_InteractionBtn4Label_" .. qStep)) + 10
        btnX = (self.width - btnW) / 2
        
        self.interactionBtn = ISButton:new(btnX, btnY, btnW, btnH, getText("IGUI_VLQ_InteractionBtn4Label_" .. qStep), self, VL_Quest_TalkToNPC_Interaction_UI.onInteractionBtn4)
        self.interactionBtn.font = UIFont.NewSmall
        self.interactionBtn:initialise()
        self.interactionBtn:instantiate()
        self.interactionBtn.borderColor = {r=1, g=1, b=1, a=0.7}
        self.interactionBtn.qStep = qStep
        self.interactionBtn.player = player
        self.interactionBtn.zNPC = zNPC
        self:addChild(self.interactionBtn)
    end
    
    --Nút tương tác --interactionButton5
    if buttonList.interactionButton5 and buttonList.interactionButton5 == true then
        btnY = btnY - btnH - space
        btnW = getTextManager():MeasureStringX(UIFont.NewSmall, getText("IGUI_VLQ_InteractionBtn5Label_" .. qStep)) + 10
        btnX = (self.width - btnW) / 2
        
        self.interactionBtn = ISButton:new(btnX, btnY, btnW, btnH, getText("IGUI_VLQ_InteractionBtn5Label_" .. qStep), self, VL_Quest_TalkToNPC_Interaction_UI.onInteractionBtn5)
        self.interactionBtn.font = UIFont.NewSmall
        self.interactionBtn:initialise()
        self.interactionBtn:instantiate()
        self.interactionBtn.borderColor = {r=1, g=1, b=1, a=0.7}
        self.interactionBtn.qStep = qStep
        self.interactionBtn.player = player
        self.interactionBtn.zNPC = zNPC
        self:addChild(self.interactionBtn)
    end
    
    local playerGMD_Event = GetPlayerGlobalModDataEvent(player, qStep)
    local _qStep = qStep
    if string.find(qStep, "freeNPC_") then
        _qStep = "freeNPC"
    end
        
    --Nút tương tác --rewardButton1
    if buttonList.rewardButton1 and buttonList.rewardButton1 == true then
        local rewardItemName1 = getScriptManager():getItem(playerGMD_Event[qStep]["rewardItem1FName"]):getDisplayName()
        local reward1Num = playerGMD_Event[qStep]["reward1Num"]
        
        btnY = btnY - btnH - space
        btnW = getTextManager():MeasureStringX(UIFont.NewSmall, getText("IGUI_VLQ_Reward_" .. _qStep, reward1Num, rewardItemName1)) + 10
        btnX = (self.width - btnW) / 2
        
        self.interactionBtn = ISButton:new(btnX, btnY, btnW, btnH, getText("IGUI_VLQ_Reward_" .. _qStep, reward1Num, rewardItemName1), self, VL_Quest_TalkToNPC_Interaction_UI.onReward1)
        self.interactionBtn.font = UIFont.NewSmall
        self.interactionBtn:initialise()
        self.interactionBtn:instantiate()
        self.interactionBtn.borderColor = {r=1, g=1, b=1, a=0.7}
        self.interactionBtn.qStep = qStep
        self.interactionBtn.player = player
        self.interactionBtn.zNPC = zNPC
        self:addChild(self.interactionBtn)
    end
    
    --Nút tương tác --rewardButton2
    if buttonList.rewardButton2 and buttonList.rewardButton2 == true then
        local rewardItemName2 = getScriptManager():getItem(playerGMD_Event[qStep]["rewardItem2FName"]):getDisplayName()
        local reward2Num = playerGMD_Event[qStep]["reward2Num"]
        btnY = btnY - btnH - space
        btnW = getTextManager():MeasureStringX(UIFont.NewSmall, getText("IGUI_VLQ_Reward_" .. _qStep, reward2Num, rewardItemName2)) + 10
        btnX = (self.width - btnW) / 2
        
        self.interactionBtn = ISButton:new(btnX, btnY, btnW, btnH, getText("IGUI_VLQ_Reward_" .. _qStep, reward2Num, rewardItemName2), self, VL_Quest_TalkToNPC_Interaction_UI.onReward2)
        self.interactionBtn.font = UIFont.NewSmall
        self.interactionBtn:initialise()
        self.interactionBtn:instantiate()
        self.interactionBtn.borderColor = {r=1, g=1, b=1, a=0.7}
        self.interactionBtn.qStep = qStep
        self.interactionBtn.player = player
        self.interactionBtn.zNPC = zNPC
        self:addChild(self.interactionBtn)
    end
    
    --Nút tương tác --rewardButton1
    if buttonList.rewardButton3 and buttonList.rewardButton3 == true then
        local rewardItemName3 = getScriptManager():getItem(playerGMD_Event[qStep]["rewardItem3FName"]):getDisplayName()
        local reward3Num = playerGMD_Event[qStep]["reward3Num"]
        btnY = btnY - btnH - space
        btnW = getTextManager():MeasureStringX(UIFont.NewSmall, getText("IGUI_VLQ_Reward_" .. _qStep, reward3Num, rewardItemName3)) + 10
        btnX = (self.width - btnW) / 2
        
        self.interactionBtn = ISButton:new(btnX, btnY, btnW, btnH, getText("IGUI_VLQ_Reward_" .. _qStep, reward3Num, rewardItemName3), self, VL_Quest_TalkToNPC_Interaction_UI.onReward3)
        self.interactionBtn.font = UIFont.NewSmall
        self.interactionBtn:initialise()
        self.interactionBtn:instantiate()
        self.interactionBtn.borderColor = {r=1, g=1, b=1, a=0.7}
        self.interactionBtn.qStep = qStep
        self.interactionBtn.player = player
        self.interactionBtn.zNPC = zNPC
        self:addChild(self.interactionBtn)
    end

    --Khởi tạo khu vực trong UI có thể scroll chuột
    self.questIntro = ISScrollingListBox:new(10, 10, self.width - 20, btnY - space * 2)
    self.questIntro:initialise()
    self.questIntro:instantiate()
    self.questIntro.itemheight = self.questIntro.height
    self.questIntro.selected = 0
    self.questIntro.joypadParent = self
    self.questIntro.font = UIFont.NewSmall
    self.questIntro.doDrawItem = self.drawIntroItem
    self.questIntro.drawBorder = true
    self:addChild(self.questIntro)
    
    --add Item
    self.questIntro:addItem("npcTalk1", { id = 1, intro = self.text})
end

function VL_Quest_TalkToNPC_Interaction_UI:drawIntroItem(y, item, alt)
    local a = 0.8
    local xOffset = 20
    local yOffset = 15
    local iData = item.item
    local itemHeight = self.itemheight
    local fontHeightSmall = getTextManager():getFontHeight(UIFont.Small)
    --Thay văn bản thuần <LINE> thành ký tự ASCII 10 \n để nhận dạng lệnh xuống dòng
    local text = iData.intro:gsub("<LINE>", "\n")

    --Chia dòng theo \n
    local lines = {}
    for line in text:gmatch("([^\n]+)") do
        table.insert(lines, line)
    end
    
    --Chia dòng khi vượt quá giới hạn ký tự
    local _lines = {}
    for _,line in ipairs(lines) do
        if line == " " then
            table.insert(_lines, line)
        else            
            local result = SplitTextByLength(line, math.floor(self.width * 0.94 * 10 + 0.5) / 10, UIFont.NewSmall)
            for i, l in ipairs(result) do
                table.insert(_lines, l)
            end
        end
    end
    
    --Tăng chiều cao cho border nếu có nhiều dòng text
    if #_lines > 14 then
        local i = #_lines - 14
        itemHeight = itemHeight + i * fontHeightSmall
    end

    --Vẽ đường viền mỗi item
    self:drawRectBorder(0, (y), self:getWidth(), itemHeight - 1, a, 1, 1, 1)
    if self.selected == item.index then
        self:drawRect(0, (y), self:getWidth(), itemHeight - 1, a, 0, 0, 0)
    end
    --Vẽ text
    for i,line in ipairs(_lines) do
        self:drawText(line, xOffset, yOffset, 1, 1, 1, a, UIFont.Small)
        yOffset = yOffset + fontHeightSmall
    end
    return y + itemHeight
end

function VL_Quest_TalkToNPC_Interaction_UI:prerender()
    self:drawRect(0, 0, self:getWidth(), self:getHeight(), 0.9, 0, 0, 0)
end

function VL_Quest_TalkToNPC_Interaction_UI:render()
    ISPanel.render(self)
    
    --Nếu cách xa NPC thì tự đóng
    if Caldistance(self.player, self.zNPC) > 4 then
        self:close()
    end
    -- Vẽ khung viền
    self:drawRectBorder(0, 0, self.width, self.height, 0.7, 1, 1, 1)
end

function VL_Quest_TalkToNPC_Interaction_UI:close()
    self:setVisible(false)
    self:removeFromUIManager()
    
    --reset window
    VLF.var.showNPCInteractionWindow = nil
end

--Close khi ấn ESC
function VL_Quest_TalkToNPC_Interaction_UI:onKeyRelease(key)
    if key == Keyboard.KEY_ESCAPE or key == Keyboard.KEY_RETURN then
        self:close()
        return
    end
end
 
--CALL
function VLF.QuestUI.NPCInteractionWindow(player, qStep, text, width, height, zNPC)
    if not VLF.var.showNPCInteractionWindow then
        local x = (getCore():getScreenWidth() - width) / 2
        local y = (getCore():getScreenHeight() - height) / 2
        
        VLF.var.showNPCInteractionWindow = VL_Quest_TalkToNPC_Interaction_UI:new(player, qStep, text, x, y, width, height, zNPC)
        VLF.var.showNPCInteractionWindow:initialise()
        VLF.var.showNPCInteractionWindow:addToUIManager()
        
        --đóng bảng danh sách nhiệm vụ nếu đang mở
        if VLF.QuestUI and VLF.QuestUI.showQuestListWindow then VLF.QuestUI.showQuestListWindow:close() end
        
    else
        VLF.var.showNPCInteractionWindow:close()
    end
end

--===============================================================--

-- Khi nhấn nút Xác nhận
function VL_Quest_TalkToNPC_Interaction_UI:onConfirm()
    self:close()
end

--Khi nhấn nút onInteractionBtn1
function VL_Quest_TalkToNPC_Interaction_UI:onInteractionBtn1()
    self:close()
    local qStep, player, zNPC = self.qStep, self.player, self.zNPC
    
    local playerGMD = GetPlayerGlobalModData(player)
    local stopLoop = false
    for _, data in pairs(playerGMD.Quest) do
        for _qStep, _data in pairs(data) do
            if _qStep == qStep then
                VLINTER.InteractionButton1[qStep](player, qStep, zNPC)
                return
            end
        end
    end
end

--Khi nhấn nút onInteractionBtn2
function VL_Quest_TalkToNPC_Interaction_UI:onInteractionBtn2()
    self:close()
    local qStep, player, zNPC = self.qStep, self.player, self.zNPC
    
    local playerGMD = GetPlayerGlobalModData(player)
    local stopLoop = false
    for _, data in pairs(playerGMD.Quest) do
        for _qStep, _data in pairs(data) do
            if _qStep == qStep then
                VLINTER.InteractionButton2[qStep](player, qStep, zNPC)
                return
            end
        end
    end
end

--Khi nhấn nút onInteractionBtn3
function VL_Quest_TalkToNPC_Interaction_UI:onInteractionBtn3()
    self:close()
    local qStep, player, zNPC = self.qStep, self.player, self.zNPC
    
    local playerGMD = GetPlayerGlobalModData(player)
    local stopLoop = false
    for _, data in pairs(playerGMD.Quest) do
        for _qStep, _data in pairs(data) do
            if _qStep == qStep then
                VLINTER.InteractionButton3[qStep](player, qStep, zNPC)
                return
            end
        end
    end
end

--Khi nhấn nút onInteractionBtn4
function VL_Quest_TalkToNPC_Interaction_UI:onInteractionBtn4()
    self:close()
    local qStep, player, zNPC = self.qStep, self.player, self.zNPC
    
    local playerGMD = GetPlayerGlobalModData(player)
    local stopLoop = false
    for _, data in pairs(playerGMD.Quest) do
        for _qStep, _data in pairs(data) do
            if _qStep == qStep then
                VLINTER.InteractionButton4[qStep](player, qStep, zNPC)
                return
            end
        end
    end
end

--Khi nhấn nút onInteractionBtn5
function VL_Quest_TalkToNPC_Interaction_UI:onInteractionBtn5()
    self:close()
    local qStep, player, zNPC = self.qStep, self.player, self.zNPC
    
    local playerGMD = GetPlayerGlobalModData(player)
    local stopLoop = false
    for _, data in pairs(playerGMD.Quest) do
        for _qStep, _data in pairs(data) do
            if _qStep == qStep then
                VLINTER.InteractionButton5[qStep](player, qStep, zNPC)
                return
            end
        end
    end
end

--==================== REWARD ===================--
--Hiển thị từ 1 đến 3 reward. Chỉ chọn 1 REWARD

--Sử dụng để trả vật phẩm nhiệm vụ và nhận phần thưởng
--call function: VLINTER.Rewards[qStep]
function VL_Quest_TalkToNPC_Interaction_UI:onReward1() 
    self:close()

    local player, qStep = self.player, self.qStep
    local playerGMD_Event = GetPlayerGlobalModDataEvent(player, qStep)
    
    if string.find(qStep, "freeNPC_") then
        if playerGMD_Event[qStep]["isQCreated"] == true then    --đảm bảo không nhầm với các qStep cũng đặt tên có text freeNPC_
            --Tất cả freeNPC sử dụng chung 1 function   VLINTER.Rewards["freeNPC"]
            VLINTER.Rewards["freeNPC"](player, qStep, {chooseReward = 1})
        end
    else
        --NPC khác sử dụng function đúng qStep của nó        
        --for _qStep, data in pairs(playerGMD_Event) do
        --    if _qStep == qStep then
        --        VLINTER.Rewards[qStep](player, qStep, {chooseReward = 2})
        --    end
        --end
    end
end

--Sử dụng để trả vật phẩm nhiệm vụ và nhận phần thưởng --Khi có 2 phần thưởng để chọn
--call function: VLINTER.Rewards[qStep]
function VL_Quest_TalkToNPC_Interaction_UI:onReward2()
    self:close()

    local player, qStep = self.player, self.qStep
    local playerGMD_Event = GetPlayerGlobalModDataEvent(player, qStep)
    
    if string.find(qStep, "freeNPC_") then
        if playerGMD_Event[qStep]["isQCreated"] == true then    --đảm bảo không nhầm với các qStep cũng đặt tên có text freeNPC_
            --Tất cả freeNPC sử dụng chung 1 function   VLINTER.Rewards["freeNPC"]
            VLINTER.Rewards["freeNPC"](player, qStep, {chooseReward = 2})
        end
    else
        --NPC khác sử dụng function đúng qStep của nó          
    end
end

--Sử dụng để trả vật phẩm nhiệm vụ và nhận phần thưởng --Khi có 3 phần thưởng để chọn
--call function: VLINTER.Rewards[qStep]
function VL_Quest_TalkToNPC_Interaction_UI:onReward3()
    self:close()

    local player, qStep = self.player, self.qStep
    local playerGMD_Event = GetPlayerGlobalModDataEvent(player, qStep)
    
    if string.find(qStep, "freeNPC_") then
        if playerGMD_Event[qStep]["isQCreated"] == true then    --đảm bảo không nhầm với các qStep cũng đặt tên có text freeNPC_
            --Tất cả freeNPC sử dụng chung 1 function   VLINTER.Rewards["freeNPC"]
            VLINTER.Rewards["freeNPC"](player, qStep, {chooseReward = 3})
        end
    else
        --NPC khác sử dụng function đúng qStep của nó        
    end
end
