/*
 *  Copyright (C) 2005-2018 Team Kodi
 *  This file is part of Kodi - https://kodi.tv
 *
 *  SPDX-License-Identifier: GPL-2.0-or-later
 *  See LICENSES/README.md for more information.
 */

#pragma once

#include "AddonClass.h"
#include "AddonString.h"
#include "Exception.h"

class CGUIDialogKeyboardGeneric;

namespace XBMCAddon
{
  namespace xbmc
  {
    XBMCCOMMONS_STANDARD_EXCEPTION(KeyboardException);

    ///
    /// \defgroup python_keyboard Keyboard
    /// \ingroup python_xbmc
    /// @{
    /// @brief **Kodi's keyboard class.**
    ///
    /// \python_class{ xbmc.Keyboard([default, heading, hidden]) }
    ///
    /// Creates a new Keyboard object with default text
    /// heading and hidden input flag if supplied.
    ///
    /// @param default    : [opt] string - default text entry.
    /// @param heading    : [opt] string - keyboard heading.
    /// @param hidden     : [opt] boolean - True for hidden text entry.
    ///
    ///
    ///-------------------------------------------------------------------------
    ///
    /// **Example:**
    /// ~~~~~~~~~~~~~{.py}
    /// ..
    /// kb = xbmc.Keyboard('default', 'heading', True)
    /// kb.setDefault('password') # optional
    /// kb.setHeading('Enter password') # optional
    /// kb.setHiddenInput(True) # optional
    /// kb.doModal()
    /// if (kb.isConfirmed()):
    ///   text = kb.getText()
    /// ..
    /// ~~~~~~~~~~~~~
    ///
    class Keyboard : public AddonClass
    {
    public:
#ifndef SWIG
      String strDefault;
      String strHeading;
      bool bHidden;
      String strText;
      bool bConfirmed = false;
#endif

      Keyboard(const String& line = emptyString, const String& heading = emptyString, bool hidden = false);
      ~Keyboard() override;

#ifdef DOXYGEN_SHOULD_USE_THIS
      ///
      /// \ingroup python_keyboard
      /// @brief \python_func{ doModal([autoclose]) }
      /// Show keyboard and wait for user action.
      ///
      /// @param autoclose      [opt] integer - milliseconds to autoclose
      ///                       dialog. (default=do not autoclose)
      ///
      ///
      ///-----------------------------------------------------------------------
      ///
      /// **Example:**
      /// ~~~~~~~~~~~~~{.py}
      /// ..
      /// kb.doModal(30000)
      /// ..
      /// ~~~~~~~~~~~~~
      ///
      doModal(...);
#else
      void doModal(int autoclose = 0);
#endif

#ifdef DOXYGEN_SHOULD_USE_THIS
      // setDefault() Method
      ///
      /// \ingroup python_keyboard
      /// @brief \python_func{ setDefault(line) }
      /// Set the default text entry.
      ///
      /// @param line        string - default text entry.
      ///
      ///
      ///-----------------------------------------------------------------------
      ///
      /// **Example:**
      /// ~~~~~~~~~~~~~{.py}
      /// ..
      /// kb.setDefault('password')
      /// ..
      /// ~~~~~~~~~~~~~
      ///
      setDefault(...);
#else
      void setDefault(const String& line = emptyString);
#endif

#ifdef DOXYGEN_SHOULD_USE_THIS
      ///
      /// \ingroup python_keyboard
      /// @brief \python_func{ setHiddenInput(hidden) }
      /// Allows hidden text entry.
      ///
      /// @param hidden        boolean - True for hidden text entry.
      ///
      ///
      ///-----------------------------------------------------------------------
      ///
      /// **Example:**
      /// ~~~~~~~~~~~~~{.py}
      /// ..
      /// kb.setHiddenInput(True)
      /// ..
      /// ~~~~~~~~~~~~~
      ///
      setHiddenInput(...);
#else
      void setHiddenInput(bool hidden = false);
#endif

      // setHeading() Method
#ifdef DOXYGEN_SHOULD_USE_THIS
      ///
      /// \ingroup python_keyboard
      /// @brief \python_func{ setHeading(heading) }
      /// Set the keyboard heading.
      ///
      /// @param heading        string - keyboard heading.
      ///
      ///
      ///-----------------------------------------------------------------------
      ///
      /// **Example:**
      /// ~~~~~~~~~~~~~{.py}
      /// ..
      /// kb.setHeading('Enter password')
      /// ..
      /// ~~~~~~~~~~~~~
      ///
      setHeading(...);
#else
      void setHeading(const String& heading);
#endif

      // getText() Method
#ifdef DOXYGEN_SHOULD_USE_THIS
      ///
      /// \ingroup python_keyboard
      /// @brief \python_func{ getText() }
      /// Returns the user input as a string.
      ///
      /// @note This will always return the text entry even if you cancel the keyboard.
      ///       Use the isConfirmed() method to check if user cancelled the keyboard.
      ///
      /// @return     get the in keyboard entered text
      ///
      ///
      ///-----------------------------------------------------------------------
      ///
      /// **Example:**
      /// ~~~~~~~~~~~~~{.py}
      /// ..
      /// text = kb.getText()
      /// ..
      /// ~~~~~~~~~~~~~
      ///
      getText();
#else
      String getText();
#endif

      // isConfirmed() Method
#ifdef DOXYGEN_SHOULD_USE_THIS
      ///
      /// \ingroup python_keyboard
      /// @brief \python_func{ isConfirmed() }
      /// Returns False if the user cancelled the input.
      ///
      /// @return     true if confirmed, if cancelled false
      ///
      ///-----------------------------------------------------------------------
      ///
      /// **Example:**
      /// ~~~~~~~~~~~~~{.py}
      /// ..
      /// if (kb.isConfirmed()):
      ///   ..
      /// ~~~~~~~~~~~~~
      ///
      isConfirmed();
#else
      bool isConfirmed();
#endif
    };
    //@}
  }
}
