MuteBards = {}
MuteBards.name = "MuteBards2"
MuteBards.Version = "2.03"

local currentSubZone;

local defaults = {
  zones = { "Ebonheart", "Nimalten", "Kragenmoor", "Davon's Watch", "Stormhold", "Riften", "Velyn Harbor", "Solitude", "Rimmen", "Belkarth", "Lilmoth", "Bright-Throat Village", "Mournhold Guild Plaza", "Mournhold Residential District" },
  currentZone = ''
};

-- Todo how can I get the current subZone name?  I could not figure that out.  If I can do that, I can add a button to mute current subZone.

--define Callback
local function OnAddOnLoaded(eventCode, addOnName)
  --Check if that is your addons on Load, if not quit
  if (addOnName ~= MuteBards.name) then
    return;
  end

  --Unregister Loaded Callback
  EVENT_MANAGER:UnregisterForEvent(MuteBards.name, EVENT_ADD_ON_LOADED);

  --create the default table
  --create the saved variable access object here and assign it to savedVars
  MuteBards.savedVars = ZO_SavedVars:NewAccountWide("MuteBards_Settings", "1.0.0", "Zones", defaults, GetWorldName());
  MuteBards:InitSettingsPanel(MuteBards.savedVars.zones);
  MuteBards:Refresh();
end

--Register Loaded Callback
EVENT_MANAGER:RegisterForEvent(MuteBards.name, EVENT_ADD_ON_LOADED, OnAddOnLoaded);

function MuteBards_CombatState(event_id, inCombat)
  if inCombat then
    MuteBards_EnableEffects()
  end
end

function MuteBards_MuteEffects()
  SetSetting(SETTING_TYPE_AUDIO, AUDIO_SETTING_SFX_VOLUME, 0)
end

function MuteBards_EnableEffects()
  SetSetting(SETTING_TYPE_AUDIO, AUDIO_SETTING_SFX_VOLUME, 70)
end

function MuteBards:AddZone(zoneName, cb)
  if (MuteBards:ContainsZone(zoneName)) then
    d('Zone ' .. zoneName .. ' already in list');
    return;
  end
  d('Adding zone ' .. zoneName);
  table.insert(MuteBards.savedVars.zones, zoneName);
  if (cb ~= nil) then
    cb();
  end
end

function MuteBards:RemoveZone(zoneName, cb)
  if (MuteBards:ContainsZone(zoneName)) then
    for i, v in ipairs(MuteBards.savedVars.zones) do
      if (v == zoneName) then
        table.remove(MuteBards.savedVars.zones, i);
        d('Zone ' .. zoneName .. ' removed from list');
        if (cb ~= nil) then
          cb();
        end
        return;
      end
    end
  end
  d('Zone ' .. zoneName .. ' not found in list');
end

function MuteBards:ContainsZone(zoneName)
  if (MuteBards.savedVars == nil or MuteBards.savedVars.zones == nil) then
    return false;
  end
  for i, v in ipairs(MuteBards.savedVars.zones) do
    if (v == zoneName) then
      return true;
    end
  end
  return false;
end

function MuteBards_AreaChange(eventCode, zoneName, subZoneName, newSubzone)
  if (MuteBards.savedVars ~= nil) then
    MuteBards.savedVars.currentSubZone = subZoneName;
  else
    currentSubZone = subZoneName
  end
  MuteBards_EnableEffects();
  if (MuteBards:ContainsZone(subZoneName)) then
    MuteBards_MuteEffects();
  end
end

-- Handle cases where you're interacting with an object?

EVENT_MANAGER:RegisterForEvent("MuteBardsCombatState", EVENT_PLAYER_COMBAT_STATE, MuteBards_CombatState)
EVENT_MANAGER:RegisterForEvent("MuteBardsAreaChange", EVENT_ZONE_CHANGED, MuteBards_AreaChange)

function MuteBards:Refresh()
  MuteBards_AreaChange(nil, nil, MuteBards.savedVars.currentSubZone or currentSubZone);
end