; objectdef CastStackAbility
; {
;     variable string Name
;     variable string AbilityTarget
;     variable string AbilityType
;     variable int Percentage
;     variable string Tag

;     method Initialize(jsonvalueref jo)
;     {
;         This:FromJSON[jo]
;     }

;     method FromJSON(jsonvalueref jo)
;     {
;         Name:Set["${jo.Get[Name]~}"]
;         AbilityTarget:Set["${jo.Get[AbilityTarget]~}"]
;         AbilityType:Set["${jo.Get[AbilityType]~}"]
;         Percentage:Set[${jo.Get[Percentage]~}]
;         ; Tag:Set["${jo.Get[Tag]~}"]
;     }

;     member:jsonvalueref AsJSON()
;     {
;         variable jsonvalue jo="{}"
;         jo:SetString[Name, "${Name~}"]
;         jo:SetString[AbilityTarget, "${AbilityTarget~}"]
;         jo:SetString[AbilityType, "${AbilityType~}"]
;         jo:SetString[Percentage, ${Percentage~}]
;         jo:SetString[Tag, "${Tag~}"]

;         return jo
;     }
; }

; objectdef CastStackContainer
; {
;     variable index:CastStackAbility Abilities

;     method AddAbilityFromJSON(jsonvalueref jo)
;     {
;         if !${jo.Type.Equal[object]}
;         {
;             return FALSE
;         }
;         Abilities:Insert[jo]
;     }

;     member:jsonvalueref AsJSON()
;     {
;         variable jsonvalue jo="[]"
;         variable iterator abilityIterator
;         Abilities:GetIterator[abilityIterator]

;         if ${abilityIterator:First(exists)}
;         {
;             do
;             {

;                 jo:Add["${abilityIterator.Value.AsJSON~}"]
;             }
;             while ${abilityIterator:Next(exists)}
;         }

;         return jo
;     }
; }

; objectdef Profile
; {
;     variable string Name
;     variable jsonvalue Settings = "{}"
;     variable jsonvalue Setup
;     variable jsonvalue Aliases
;     variable CastStackContainer CastStack

;     method Initialize(jsonvalueref jo)
;     {
;        This:FromJSON[jo]
;     }

;     member:bool GetSettingValue(string key)
;     {
;         echo "Profile.GetSettingValue[${key}]"
;         return ${This.Settings.Get["${key}"]}
;     }

;     method FromJSON(jsonvalueref jo)
;     {
;         Name:Set["${jo.Get["Name"]~}"]
;         Settings:SetValue["${jo.Get["Settings"]~}"]
;         Setup:SetValue["${jo.Get["Setup"]~}"]
;         Aliases:SetValue["${jo.Get["Aliases"]~}"]
;         jo.Get["CastStack"]:ForEach["CastStack:AddAbilityFromJSON[ForEach.Value]"]

;     }

;     member:jsonvalueref AsJSON()
;     {
;         variable jsonvalue jo="{}"
;         jo:Set["Name", "${This.Name.AsJSON~}"]
;         jo:Set["Settings", "${Settings.AsJSON~}"]
;         jo:Set["Setup", "${Setup.AsJSON~}"]
;         jo:Set["Aliases", "${Aliases.AsJSON~}"]
;         jo:Set["CastStack", "${CastStack.AsJSON~}"]

;         return jo
;     }
; }

; objectdef BotSettings
; {
;     variable string DefaultProfile
;     variable collection:Profile Profiles

;     method FromFile(string filename)
;     {
;         variable jsonvalue settingsJson
;         variable BotSettings settings
;         settingsJson:ParseFile["${filename}"]
        
;         This:FromJSON[settingsJson]
;     }

;     member:bool IsSettingChecked(string key)
;     {
;         echo "BotSettings.IsSettingChecked[${key}]"
;         return ${This.CurrentProfile.GetSettingValue["${key}"].Equal[TRUE]}
;     }

;     method FromJSON(jsonvalueref jo)
;     {
;         DefaultProfile:Set[${jo.Get["DefaultProfile"]}]
;         variable jsoniterator profileIterator
;         jo.Get["Profiles"]:GetIterator[profileIterator]
;         if ${profileIterator:First(exists)}
;         {
;              do
;              {
;                  Profiles:Set[${profileIterator.Key}, profileIterator.Value]
;              }
;              while ${profileIterator:Next(exists)}
;         }
;     }

;     member:jsonvalueref AsJSON()
;     {
;         variable jsonvalue jo="{}"
;         jo:Set[DefaultProfile, "${DefaultProfile.AsJSON~}"]
;         jo:Set[Profiles, "${Profiles.AsJSON~}"]
;         return jo
;     }

;     member:weakref CurrentProfile()
;     {
;         return Profiles.Element["${This.DefaultProfile}"]
;     }
; }

objectdef SettingsController 
{
    method Initialize()
    {
        LGUI2:LoadPackageFile["${LavishScript.HomeDirectory}/scripts/mr/common/MRSkin.json"]
		LGUI2:LoadPackageFile["settings.json"]
    }

    method Shutdown()
    {
        LGUI2:UnloadPackageFile["settings.json"]
        Event[OnBotClose]:Execute
    }

    method OnClose()
    {
        Script:End
    }
}

variable(global) SettingsController MRSettingsController

function main() 
{
    while 1
    {
        wait 5
    }
}