local extKey = "annabunches/AtlasExporter"

function init(plugin)
  plugin:newCommand{
    id="AnnabunchesASEExportSpritesheetAdvanced",
    title="Export Spritesheet (Advanced)",
    group="file_export",
    onclick=exportSpritesheetAdvanced
  }

  plugin:newCommand{
    id="AnnabunchesASEToggleIgnoreLayer",
    title="Ignore on Export",
    group="layer_popup_menu",
    onclick=toggleIgnore
  }

  plugin:newCommand{
    id="AnnabunchesASEToggleExportAsSprite",
    title="Export as Sprite",
    group="layer_popup_menu",
    onclick=toggleExportAsSprite
  }
end

local function revealLayers(layers)
  for i, layer in ipairs(layers) do
    if layer.isGroup then
      revealLayers(layer.layers)
    end

    if not layer.isVisible then
      layer.isVisible = true
      layer.properties(extKey).revealed = true
    end
  end
end

local function restoreLayers(layers)
  for i, layer in ipairs(layers) do
    if layer.isGroup then
      restoreLayers(layer.layers)
    end

    if layer.properties(extKey).revealed then
      layer.isVisible = false
--      layer.properties(extKey).revealed = nil
    end
  end
end

local function deleteLayers(sprite, layers)
  for i, layer in ipairs(layers) do
    if layer.name:find("%+i") then
      sprite:deleteLayer(layer)
    elseif layer.isGroup then
      deleteLayers(sprite, layer.layers)
    end
  end
end

local function flattenLayers(layers)
  for i, layer in ipairs(layers) do
    if not layer.isGroup then
      goto continue
    end

    -- Layers "tagged" with +f get flattened
    if layer.name:find("%+f") then
      app.range.layers = { layer }
      app.command.FlattenLayers(false)
    else
      -- recurse
      flattenLayers(layer.layers)
    end

    ::continue::
  end
end

local function exportSpritesheetAdvanced()
  local sprite = app.activeSprite
  if not sprite then
    return app.alert "Must have a sprite open to export."
  end

  app.transaction(function()
    deleteLayers(sprite, sprite.layers)
    flattenLayers(sprite.layers)
    revealLayers(sprite.layers)
  end)
  app.command.ExportSpriteSheet {
    splitLayers=true,
  }
  restoreLayers(sprite.layers)
  app.undo()
end

main()