// Aseprite
// Copyright (C) 2020  Igara Studio S.A.
//
// This program is distributed under the terms of
// the End-User License Agreement for Aseprite.

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "app/app.h"
#include "app/commands/command.h"
#include "app/commands/params.h"
#include "app/i18n/strings.h"
#include "app/ui/color_bar.h"
#include "fmt/format.h"

namespace app {

using namespace gfx;

class TilesetModeCommand : public Command {
public:
  TilesetModeCommand()
    : Command(CommandId::TilesetMode(), CmdUIOnlyFlag) {
    m_mode = TilesetMode::Auto;
  }

protected:

  void onLoadParams(const Params& params) override {
    std::string mode = params.get("mode");
    if (mode == "manual") m_mode = TilesetMode::Manual;
    else if (mode == "stack") m_mode = TilesetMode::Stack;
    else m_mode = TilesetMode::Auto;
  }

  bool onChecked(Context* context) override {
    auto colorBar = ColorBar::instance();
    return (colorBar->tilesetMode() == m_mode);
  }

  void onExecute(Context* context) override {
    auto colorBar = ColorBar::instance();
    colorBar->setTilesetMode(m_mode);
  }

  std::string onGetFriendlyName() const override {
    std::string mode;
    switch (m_mode) {
      case TilesetMode::Manual: mode = Strings::commands_TilesetMode_Manual(); break;
      case TilesetMode::Auto:   mode = Strings::commands_TilesetMode_Auto();   break;
      case TilesetMode::Stack:  mode = Strings::commands_TilesetMode_Stack();  break;
    }
    return fmt::format(getBaseFriendlyName(), mode);
  }

private:
  TilesetMode m_mode;
};

Command* CommandFactory::createTilesetModeCommand()
{
  return new TilesetModeCommand;
}

} // namespace app
