/*
  Copyright:    © 2018 SIL International.
  Description:  Internal keyboard class and adaptor class for the API.
  Create Date:  2 Oct 2018
  Authors:      Tim Eves (TSE)
  History:      7 Oct 2018 - TSE - Refactored out of km_core_keyboard_api.cpp
*/
#include "keyboard.hpp"
#include "jsonpp.hpp"

using namespace km::core;


inline
void keyboard_attributes::render()
{
  // Make attributes point to the stored values above.
  id              = _keyboard_id.c_str();
  version_string  = _version_string.c_str();
  default_options = _default_opts.data();
}


keyboard_attributes::keyboard_attributes(std::u16string const & kbid,
    std::u16string const & version,
    options_store const &opts)
: _keyboard_id(kbid),
  _version_string(version),
  _default_opts(opts)
{
  // Ensure that the default_options array will be properly terminated.
  _default_opts.emplace_back();
  render();
}


keyboard_attributes::keyboard_attributes(keyboard_attributes &&rhs)
: _keyboard_id(std::move(rhs._keyboard_id)),
  _version_string(std::move(rhs._version_string)),
  _default_opts(std::move(rhs._default_opts))
{
    rhs.id = rhs.version_string = nullptr;
    render();
}


keyboard_attributes & keyboard_attributes::operator = (keyboard_attributes &&rhs)
{
  return *new (this) keyboard_attributes(std::move(rhs));
}


json & km::core::operator << (json & j, km::core::keyboard_attributes const & kb)
{
  j << json::object
      << "id" << kb.id
      << "version" << kb.version_string
      << "rules" << json::array << json::close;

  return j << json::close;
}
