Quantcast
local me, ns = ...
local pp=print
ns.Configure()
local GarrisonMissionFrame_SetItemRewardDetails=GarrisonMissionFrame_SetItemRewardDetails
local GetItemCount=GetItemCount
local addon=addon --#addon
local over=over --#over
local _G=_G
local GSF=GSF
local GSFMissions=GSFMissions
local G=C_Garrison
local pairs=pairs
local kpairs=addon:GetKpairs()
local format=format
local strsplit=strsplit
local select=select
local GetCurrencyInfo=GetCurrencyInfo
local generated
local GARRISON_CURRENCY=GARRISON_CURRENCY
local GARRISON_SHIP_OIL_CURRENCY=GARRISON_SHIP_OIL_CURRENCY
local GARRISON_FOLLOWER_MAX_LEVEL=GARRISON_FOLLOWER_MAX_LEVEL
local LE_FOLLOWER_TYPE_GARRISON_6_0=LE_FOLLOWER_TYPE_GARRISON_6_0
local LE_FOLLOWER_TYPE_SHIPYARD_6_2=LE_FOLLOWER_TYPE_SHIPYARD_6_2
local GARRISON_FOLLOWER_MAX_UPGRADE_QUALITY=GARRISON_FOLLOWER_MAX_UPGRADE_QUALITY[LE_FOLLOWER_TYPE_SHIPYARD_6_2]
local module=addon:NewSubClass('ShipYard') --#Module
local GameTooltip=GameTooltip
local GarrisonShipyardMapMissionTooltip=GarrisonShipyardMapMissionTooltip
local GCS
local shipEnhancement={
	127882,
	127883,
	127884,
	127663,
	125787,
	127662,
	127880,
	127881,
	127894,
	127886
}
local lastTab=1
function module:Test()

--@debug@
print("test")
--@end-debug@
end
function module:OnInitialize()
	--GARRISON_SHIPYARD_NPC_OPEN
	--GARRISON_SHIPYARD_NPC_CLOSE
	self:SafeSecureHook("GarrisonFollowerButton_UpdateCounters")
	self:SafeSecureHook(GSF,"OnClickMission","HookedGSF_OnClickMission")
	self:SafeSecureHook("GarrisonShipyardMapMission_OnEnter")
	self:SafeSecureHook("GarrisonShipyardMapMission_OnLeave")
	self:SafeSecureHook(GSF,"SelectTab","AddMenu")
	self:SafeSecureHookScript(GSF,"OnShow","Setup",true)
	self:SafeRegisterEvent("GARRISON_SHIPYARD_NPC_CLOSED")
	self:SafeRegisterEvent("GARRISON_MISSION_STARTED")
	self:SafeSecureHookScript(GSF.FollowerTab,"OnShow","FollowerOnShow")

end
function module:OpenLastTab()
--@debug@
	print("Open Last Tab",lastTab)
--@end-debug@
	lastTab=lastTab or PanelTemplates_GetSelectedTab(GSF)
	if lastTab then
		if GSF.MissionControlTab:IsVisible() then
			GSF.MissionControlTab:Hide()
			GSF.tabMC:SetChecked(false)
			if lastTab==2 then
				GSF.FollowerTab:Show()
				GSF.FollowerList:Show()
				self:RefreshFollowerStatus()
			else
				GSF.MissionTab:Show()
			end
		end
		GSF:SelectTab(lastTab)
	else
		return self:OpenMissionsTab()
	end
end
function module:OpenFollowersTab()
	lastTab=2
	return self:OpenLastTab()
end
function module:OpenMissionsTab()
	lastTab=1
	return self:OpenLastTab()
end
function module:OpenProgressTab()
	lastTab=3
	return self:OpenLastTab()
end
function module:CloseMissionControlTab()
	GSF.MissionControlTab:Hide()
	GSF.tabMC:SetChecked(false)
end
function module:OpenMissionControlTab()
	if (not GSF.MissionControlTab:IsVisible()) then
		lastTab=PanelTemplates_GetSelectedTab(GSF)
		GSF.FollowerTab:Hide()
		GSF.FollowerList:Hide()
		GSF.MissionTab:Hide()
		GSF.BorderFrame.TitleText:SetText(L["Shipyard Commander Mission Control"])
		GSF.MissionControlTab:Show()
		GSF.MissionControlTab.startButton:Click()
		GSF.tabMC:SetChecked(true)
	else
		self:OpenLastTab()
		GSF.tabMC:SetChecked(false)
		self:OpenLastTab()
	end
	self:RefreshMenu()
end

function module:GetMain()
	return GSF
end
function module:GetMissions()
	return GSFMissions
end
function module:GetBigScreen()
	return false
end
---
--Invoked on every mission display, only for available missions
--
local i=0
--@debug@
local function colors(c1,c2)
	return C[c1].r,C[c1].g,C[c1].b,C[c2].r,C[c2].g,C[c2].b
end
local function dump(tip,data,indent)
	indent=indent or ''
	for k,v in kpairs(data) do
		local color="Silver"
		if type(v)=="number" then color="Cyan"
		elseif type(v)=="string" then color="Yellow" v=v:sub(1,30)
		elseif type(v)=="boolean" then v=v and 'True' or 'False' color="White"
		elseif type(v)=="table" then color="Green"
		else v=type(v) color="Blue"
		end
		if k=="description" then v =v:sub(1,10) end
		if type(v)=="table" then
			if v.GetObjectType then
				v=v:GetObjectType()
				tip:AddDoubleLine(indent..k,v,colors("Purple",color))
			else
				tip:AddDoubleLine(indent..k,v,colors("Yellow",color))
				dump(tip,v,indent .. '  ')
			end
		else
			tip:AddDoubleLine(indent..k,v,colors("Orange",color))
		end
	end
end
function module:TTDump(frame,data)
	local anchor = "ANCHOR_TOPRIGHT"
	GameTooltip:SetOwner(frame,anchor)
	dump(GameTooltip,data)
	GameTooltip:Show()
end
--@end-debug@
function module:HookedGarrisonShipyardMap_SetupBonus(missionList,frame,mission)
	if not GSF:IsShown() then return end
	addon:AddExtraData(mission)
	local perc=addon:MatchMaker(mission)
	local addendum=frame.GcAddendum
	if not addendum then
		if mission.inProgress then return end
		i=i+1
		addendum=CreateFrame("Frame",nil,frame)
		addendum:SetPoint("TOP",frame,"BOTTOM",0,10)
--@debug@
		addendum:EnableMouse(true)
		addendum:SetScript("OnEnter",function(frame) module:TTDump(frame,mission) end)
		addendum:SetScript("OnLeave",function(frame) GameTooltip:Hide() end)
--@end-debug@
		AddBackdrop(addendum)
		addendum:SetBackdropColor(0,0,0,0.5)
		addendum:SetWidth(50)
		addendum:SetHeight(25)
		addendum.chance=addendum:CreateFontString(nil,"TOOLTIP","GameFontHighlightMedium")
		addendum.chance:SetAllPoints()
		addendum.chance:SetJustifyH("CENTER")
		addendum.chance:SetJustifyV("CENTER")
		addendum.icon=addendum:CreateTexture(nil,"ARTWORK")
		addendum.icon:SetWidth(24)
		addendum.icon:SetHeight(24)
		addendum.icon:SetPoint("LEFT",addendum.chance,"RIGHT")
		frame.GcAddendum=addendum
	end
	if mission.inProgress then addendum:Hide() return end
	addendum:Show()
	addendum.chance:SetFormattedText("%d%%",perc)
	addendum.chance:SetTextColor(self:GetDifficultyColors(perc))
	local reward=mission.rewards[1]
	if reward.icon then
		addendum.icon:SetTexture(reward.icon)
	elseif reward.itemID then
		addendum.icon:SetTexture(GetItemIcon(reward.itemID))
	end
	local cost=mission.cost
	local currency=mission.costCurrencyTypesID
	if not mission.canStart then
		addendum:SetBackdropBorderColor(0,0,0)
		return
	end
	if cost and currency then
		local _,available=GetCurrencyInfo(currency)
		if cost>available then
			addendum:SetBackdropBorderColor(1,0,0)
		else
			addendum:SetBackdropBorderColor(0,1,0)
		end
	else
		addendum:SetBackdropBorderColor(1,1,1)

	end
	--addendum.expire:SetText(mission.class)
	--addendum.duration:SetText(mission.duration)
end
function module:HookedGarrisonShipyardMap_UpdateMissions()
	local list = GSF.MissionTab.MissionList
	for i=1,#list.missions do
		local frame = list.missionFrames[i]
		if not self:IsHooked(frame,"PostClick") then
			self:SafeHookScript(frame,"PostClick","ScriptMapButtonOnClick",true)
		end
	end

end
function module:ScriptMapButtonOnClick(this)
	self:FillMissionPage(this.info)
end
function module:HookedGSF_OnClickMission(this,missionInfo)
	self:FillMissionPage(missionInfo)
	self:RefreshFollowerStatus()
end
function module:HookedGarrisonFollowerButton_UpdateCounters(gsf,frame,follower,showcounter,lastupdate)
	if follower.followerTypeID~=LE_FOLLOWER_TYPE_SHIPYARD_6_2 then return end
	if not frame.GCXp then
		frame.GCXp=frame:CreateFontString(nil,"OVERLAY","GameFontHighlightSmall")
	end
	if follower.isCollected and follower.quality < GARRISON_FOLLOWER_MAX_UPGRADE_QUALITY  then
		frame.GCXp:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,-5)
		frame.GCXp:SetFormattedText("Xp to go: %d",follower.levelXP-follower.xp)
		frame.GCXp:Show()
	else
		frame.GCXp:Hide()
	end
--@debug@
	print(follower)
--@end-debug@
end


function module:Setup(this,...)
--@debug@
print("Doing one time initialization for",this:GetName(),...)
--@end-debug@
	addon:CheckMP()
	GCS=addon:CreateHeader(self,'SHIPMOVEPANEL','SHIPPIN')
	local ref=GSFMissions.CompleteDialog.BorderFrame.ViewButton
	local bt = CreateFrame('BUTTON','GCQuickShipMissionCompletionButton', ref, 'UIPanelButtonTemplate')
	bt.missionType=LE_FOLLOWER_TYPE_SHIPYARD_6_2
	bt:SetWidth(300)
	bt:SetText(L["Garrison Comander Quick Mission Completion"])
	bt:SetPoint("CENTER",0,-50)
	addon:ActivateButton(bt,"MissionComplete",L["Complete all missions without confirmation"])
	if IsAddOnLoaded("MasterPlanA") then
		self:SafeSecureHook("GarrisonShipyardMap_UpdateMissions") -- low efficiency, but survives MasterPlan
	end
	self:SafeSecureHook("GarrisonShipyardMap_SetupBonus")
	--GarrisonShipyardFrameFollowersListScrollFrameButton1
	--GarrisonShipyardMapMission1
	addon:AddLabel(L["Shipyard Appearance"])
	--addon:AddToggle("SHIPMOVEPANEL",true,L["Unlock Panel"],L["Makes shipyard panel movable"])
	--addon:AddToggle("BIGSCREEN",true,L["Use big screen"],L["Disabling this will give you the interface from 1.1.8, given or taken. Need to reload interface"])
	addon:AddToggle("SHIPPIN",true,L["Show Garrison Commander menu"],L["Disable if you dont want the full Garrison Commander Header."])
 	addon:AddToggle("SHIPENHA",true,L["Show Enhancement buttons"],L["Disable if you dont want the equipment buttons in ship view."])
	local tabHP=CreateFrame("Button",nil,GSF,"SpellBookSkillLineTabTemplate")
	GSF.tabHP=tabHP
	tabHP.tooltip=L["Open Garrison Commander Help"]
	tabHP:SetNormalTexture("Interface\\ICONS\\INV_Misc_QuestionMark.blp")
	tabHP:SetPushedTexture("Interface\\ICONS\\INV_Misc_QuestionMark.blp")
	tabHP:Show()
	tabHP:SetPoint('TOPLEFT',GCS,'TOPRIGHT',0,-10)
	tabHP:SetScript("OnClick",function(this,button) addon:ShowHelpWindow(this,button) end)
	local tabMC=CreateFrame("CheckButton",nil,GSF,"SpellBookSkillLineTabTemplate")
	GSF.tabMC=tabMC
	tabMC.tooltip=L["Open Garrison Commander Mission Control"]
	tabMC:SetNormalTexture("Interface\\ICONS\\ACHIEVEMENT_GUILDPERK_WORKINGOVERTIME.blp")
	tabMC:SetScript("OnClick",function(this,...) module:OpenMissionControlTab() end)
	tabMC:Show()
	tabMC:SetPoint('TOPLEFT',GCS,'TOPRIGHT',0,-60)
	local tabQ=CreateFrame("Button",nil,GSF,"SpellBookSkillLineTabTemplate")
	GSF.tabQ=tabQ
	tabQ.tooltip=L["Automatically process completed missions and schedules new ones."].."\n"..
		format(L["Check %s in mission control in order to be also logged out"],L["Auto Logout"]) .. "\n" ..
		C(format(L["Keep pressed %s while opening table to automate processing"],CTRL_KEY),"green")
	tabQ:SetNormalTexture("Interface\\ICONS\\Ability_Rogue_Sprint.blp")
	tabQ:SetPushedTexture("Interface\\ICONS\\Ability_Rogue_Sprint.blp")
	tabQ:Show()
	tabQ:SetScript("OnClick",function(this,button) addon:RunQuick() end)
	tabQ:SetPoint('TOPLEFT',GCS,'TOPRIGHT',0,-210)

	GSF.FollowerStatusInfo=GSF.BorderFrame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	GSF.ResourceInfo=GSF.BorderFrame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	GSF.ResourceFormat="|TInterface\\Icons\\garrison_oil:0|t %s " .. GetCurrencyInfo(GARRISON_SHIP_OIL_CURRENCY)
	GSF.ResourceInfo:SetPoint("TOPLEFT",5,0)
	GSF.ResourceInfo:SetHeight(25)
	GSF.FollowerStatusInfo:SetPoint("TOPRIGHT",-30,0)
	GSF.FollowerStatusInfo:SetHeight(25)
	GSF.FollowerStatusInfo:Show()
	self:ScriptGarrisonShipyardFrame_OnShow()
	self:SafeHookScript(GSF,"OnShow")
	ns.tabCO:ClearAllPoints()
	ns.tabCO:SetParent(GSF)
	ns.tabCO:SetPoint('TOPRIGHT',GSF,'TOPLEFT',0,0)
	for i =1,9 do
		local hook="GarrisonShipyardFrameTab" ..i
		if (_G[hook]) then
			self:SafeHookScript(hook,"OnClick","HookedClickOnTabs")
		end
	end
	self:SafeSecureHookScript(GSF,"OnShow")
	self:SafeHookScript(GSF,"OnHide","EventGARRISON_SHIPYARD_NPC_CLOSED")
end
function module:HookedClickOnTabs()
	self:CloseMissionControlTab()
end
function module:ScriptGarrisonShipyardFrame_OnShow()
--@debug@
	print("Doing all time initialization")
	print(GetTime())
--@end-debug@
	GCS:Show()
	GCS:SetWidth(GSF:GetWidth())
	GSF:ClearAllPoints()
	GSF:SetPoint("TOPLEFT",GCS,"BOTTOMLEFT",0,23)
	GSF:SetPoint("TOPRIGHT",GCS,"BOTTOMRIGHT",0,23)
	self:RefreshMenu()
	self:RefreshCurrency()
	self:RefreshFollowerStatus()
	if IsControlKeyDown() then
		self:ScheduleTimer("RunQuick",0.1,true)
	end
end
function module:HookedGarrisonShipyardMapMission_OnLeave()

--@debug@
print("OnLeave")
--@end-debug@
	GameTooltip:Hide()
end
function module:HookedGarrisonShipyardMapMission_OnEnter(frame)
	local g=GameTooltip
	g:SetOwner(GarrisonShipyardMapMissionTooltip, "ANCHOR_NONE")
	g:SetPoint("TOPLEFT",GarrisonShipyardMapMissionTooltip,"BOTTOMLEFT")
	local mission=frame.info
	local missionID=mission.missionID
	addon:AddFollowersToTooltip(missionID,LE_FOLLOWER_TYPE_SHIPYARD_6_2)
--@debug@
	g:AddDoubleLine("MissionID:",missionID)
	g:AddDoubleLine("Class",mission.class)
--@end-debug@
	g:Show()
	if g:GetWidth() < GarrisonShipyardMapMissionTooltip:GetWidth() then
		g:SetWidth(GarrisonShipyardMapMissionTooltip:GetWidth())
	end
end
function addon:EventGARRISON_SHIPYARD_NPC_CLOSED(event,...)
--@debug@
print("NPC CLOSED")
--@end-debug@
	if (GCS) then
		self:RemoveMenu()
		GCS:Hide()
	end
end
function module:EventCHAT_MSG_CURRENCY(event)
	self:RefreshCurrency()
end
function module:RefreshCurrency()
	if GSF:IsVisible() then
		local qt=select(2,GetCurrencyInfo(GARRISON_SHIP_OIL_CURRENCY))
		GSF.ResourceInfo:SetFormattedText(GSF.ResourceFormat,qt)
		if qt > 1000 then
			GSF.ResourceInfo:SetTextColor(C.Green())
		elseif qt > 200 then
			GSF.ResourceInfo:SetTextColor(C.Orange())
		else
			GSF.ResourceInfo:SetTextColor(C.Red())
		end
	end
end
function module:EventGARRISON_MISSION_STARTED(event,missionType,missionID,...)
	--@debug@
	print(event,missionID)
	--@end-debug@
	self:RefreshFollowerStatus()
	self:ScheduleTimer("RefreshCurrency",0.2)
end
function module:RefreshMenu()
	if not GCS then return end  -- This could be called befaur header is built
	if not self.currentmenu or not self.currentmenu:IsVisible() then
		self:RemoveMenu()
		self:AddMenu()
	end
end
function module:AddMenu()
	if not GCS or GCS.Menu then
		return
	end
--@debug@
	print("Adding Menu",GCS.Menu,GSF.MissionTab:IsVisible(),GSF.FollowerTab:IsVisible())
--@end-debug@
	local menu,size
	self.currentmenu=GSF.FollowerTab
	menu,size=self:CreateOptionsLayer('SHIPMOVEPANEL','SHIPENHA','SGCSKIPEPIC','SGCMINLEVEL','SGCRIG')
--@debug@
	self:AddOptionToOptionsLayer(menu,'DBG')
	self:AddOptionToOptionsLayer(menu,'TRC')
--@end-debug@
	local frame=menu.frame
	frame:Show()
	frame:SetParent(GCS)
	frame:SetFrameStrata(GCS:GetFrameStrata())
	frame:SetFrameLevel(GCS:GetFrameLevel()+2)
	menu:ClearAllPoints()
	menu:SetPoint("TOPLEFT",GCS,"TOPLEFT",25,-18)
	menu:SetWidth(GCS:GetWidth()-50)
	menu:SetHeight(GCS:GetHeight()-50)
	menu:DoLayout()
	GCS.Menu=menu
end
function module:RemoveMenu()
--@debug@
print("Removing menu")
--@end-debug@
	if (GCS.Menu) then
		local rc,message=pcall(GCS.Menu.Release,GCS.Menu)
		--@debug@
		print("Removed menu",rc,message)
		--@end-debug@
		GCS.Menu=nil
	end
end

function module:FollowerOnShow()
  if addon:GetBoolean("SHIPENHA") then
  	self:ShowEnhancements()
  end
end
local upgrades
function addon:ApplySHIPENHA(value)
  if value then
    if GSF.FollowerTab:IsVisible() then
      module:ShowEnhancements()
    end
  else
    if upgrades then upgrades:Hide() end
  end

end
function module:ShowEnhancements()
	if not upgrades then
		upgrades=CreateFrame("Frame","UPG",GarrisonShipyardFrame.FollowerTab)
		upgrades.items={}

		upgrades:ClearAllPoints()
		upgrades:SetPoint("TOPLEFT",10,-100)
		upgrades:SetPoint("BOTTOMLEFT",0,0)
		upgrades:SetWidth(50)
	end
	for i,itemID in pairs(shipEnhancement) do
		local e
		if  not  upgrades.items[i] then
			upgrades.items[i]=CreateFrame("Button","But"..i,upgrades,"GarrisonCommanderUpgradeButton,SecureActionButtonTemplate")
			e=upgrades.items[i]
			e.itemID=itemID
			e.Icon:SetSize(40,40)
			e:SetPoint("TOPLEFT",0,-45*(i-1))
			GarrisonMissionFrame_SetItemRewardDetails(e)
			e:EnableMouse(true)
			e:RegisterForClicks("LeftButtonDown")
			e:SetAttribute("type","item")
			e:SetAttribute("item",select(2,GetItemInfo(itemID)))
		else
			e=upgrades.items[i]
		end
		local qt=GetItemCount(itemID)
		e.Quantity:SetText(qt)
		e.Quantity:Show()
		e.Icon:SetDesaturated(qt==0)
		e:Show()
	end
	upgrades:Show()
end
do
	local s=setmetatable({},{__index=function(t,k) return 0 end})
	local FOLLOWER_STATUS_FORMAT="Ship status: " ..
								C(AVAILABLE..':%d ','green') ..
								C(GARRISON_FOLLOWER_ON_MISSION .. ":%d ",'red')
	function module:RefreshFollowerStatus()

		wipe(s)
		for _,followerID in self:GetShipsIterator() do
			local status=self:GetFollowerStatus(followerID)
			s[status]=s[status]+1
		end
		if (GSF.FollowerStatusInfo) then
			GSF.FollowerStatusInfo:SetWidth(0)
			GSF.FollowerStatusInfo:SetFormattedText(
				FOLLOWER_STATUS_FORMAT,
				s[AVAILABLE],
				s[GARRISON_FOLLOWER_ON_MISSION]
				)
		end
	end
	function module:GetTotFollowers(status)
		if not status then
			return s[AVAILABLE]+
				s[GARRISON_FOLLOWER_ON_MISSION]
		else
			return s[status] or 0
		end
	end
end
--[[ Follower
displayHeight = 0.25
followerTypeID = 2
iLevel = 600
isCollected = true
classAtlas = Ships_TroopTransport-List
garrFollowerID = 0x00000000000001E2
displayScale = 95
level = 100
quality = 3
portraitIconID = 0
isFavorite = false
xp = 1500
texPrefix = Ships_TroopTransport
className = Transport
classSpec = 53
name = Chen's Favorite Brew
followerID = 0x00000000011E4D8F
height = 0.30000001192093
displayID = 63894
scale = 110
levelXP = 40000
--]]
--[[ Mission
followerTypeID = 2
description = Hellscream has posted a sub near the Horde's main base on Ashran. Take that sub out. Alliance, that means you, too. Factional hatreds have no place here.
cost = 150
adjustedPosX = 798
duration = 8 hr
adjustedPosY = -246
durationSeconds = 28800
state = -2
inProgress=false
typePrefix = ShipMissionIcon-Treasure
typeAtlas = ShipMissionIcon-Treasure-Mission
offerTimeRemaining = 19 days 1 hr
level = 100
offeredGarrMissionTextureID = 0
offerEndTime = 1681052.25
mapPosY = -246
type = Ship-Treasure
name = Warspear Fishing
iLevel = 0
numRewards = 1
rewards = [table: 000000004D079210]
hasBonusEffect = false
numFollowers = 2
costCurrencyTypesID = 1101
followers = [table: 000000004D0791C0]
missionID = 563
canStart = false
location = [ph]
isRare = false
mapPosX = 798
locPrefix = GarrMissionLocation-TannanSea
--]]
--view mission button GSF.MissionTab.MissionList.CompleteDialog.BorderFrame.ViewButton