from ttkbootstrap.window import get_default_root


class MessageCatalog:
    @staticmethod
    def translate(src):
        """Returns a translation of src according to the user's current
        locale.

        This is the main function used to localize an application.
        Instead of using an English string directly, an applicaton can
        pass the English string through `translate` and use the result.
        If an application is written for a single language in this
        fashion, then it is easy to add support for additional languages
        later simply by defining new message catalog entries.

        Parameters:

            src (str):
                The string to be translated.

        Returns:

            str:
                The translated string.
        """
        root = get_default_root()
        command = "::msgcat::mc"
        return root.tk.eval(f'{command} "{src}"')

    @staticmethod
    def locale(newlocale=None):
        """ "This function sets the locale to newlocale. If newlocale is
        omitted, the current locale is returned, otherwise the current
        locale is set to newlocale. The initial locale defaults to the
        locale specified in the user's environment.

        Parameters:

            newlocale (str):
                The new locale code used to define the language for the
                application.

        Returns:

            str:
                The current locale name if newlocale is None or an empty
                string.
        """
        root = get_default_root()
        command = "::msgcat::mclocale"
        return root.tk.eval(f'{command} {newlocale or ""}')

    @staticmethod
    def preferences():
        """Returns an ordered list of the locales preferred by the user,
        based on the user's language specification. The list is ordered
        from most specific to least preference. If the user has specified
        LANG=en_US_funky, this method would return {en_US_funky en_US en}.

        Returns:

            List[str, ...]:
                Locales preferred by the user.
        """
        root = get_default_root()
        command = "::msgcat::mcpreferences"
        items = root.tk.eval(command).split(" ")
        if len(items) > 0:
            return items[0:-1]
        else:
            return []

    @staticmethod
    def load(dirname):
        """Searches the specified directory for files that match the
        language specifications returned by `preferences`. Each file
        located is sourced.

        Parameters:

            dirname (str or Pathlike object):
                The directory path of the msg files.

        Returns:

            int:
                Then number of message files which matched the
                specification and were loaded.
        """
        from pathlib import Path
        msgs = Path(dirname).as_posix() # format path for tcl/tk
        
        root = get_default_root()
        command = "::msgcat::mcload"
        return int(root.tk.eval(f"{command} [list {msgs}]"))

    @staticmethod
    def set(locale, src, translated=None):
        """Sets the translation for 'src' to 'translated' in the
        specified locale. If translated is not specified, src is used
        for both.

        Parameters:

            locale (str):
                The local code used when translating the src.

            src (str):
                The original language string.

            translated (str):
                The translated string.
        """
        root = get_default_root()
        command = "::msgcat::mcset"
        root.tk.eval(f'{command} {locale} {src} {translated or ""}')

    @staticmethod
    def set_many(locale, *args):
        """Sets the translation for multiple source strings in *args in
        the specified locale and the current namespace. Must be an even
        number of args.

        Parameters:

            locale (str):
                The local code used when translating the src.

            *args (str):
                A series of src, translated pairs.

        Returns:

            int:
                The number of translation sets.
        """
        root = get_default_root()
        command = "::msgcat::mcmset"
        messages = " ".join([f'"{x}"' for x in args])
        out = f"{command} {locale} {{{messages}}}"
        return int(root.tk.eval(out))

    @staticmethod
    def max(*src):
        """Given several source strings, max returns the length of the
        longest translated string. This is useful when designing localized
        GUIs, which may require that all buttons, for example, be a fixed
        width (which will be the width of the widest button).

        Parameters:

            *src (str):
                A series of strings to compare

        Returns:

            int:
                The length of the longest str.
        """
        root = get_default_root()
        command = "::msgcat::mcmax"
        return int(root.tk.eval(f'{command} {" ".join(src)}'))


if __name__ == "__main__":

    # testing
    from ttkbootstrap import localization

    localization.initialize_localities()
    MessageCatalog.locale("zh_cn")
    result = MessageCatalog.translate("Skip Messages")
    print(result)
    result = MessageCatalog.translate("yes")
    print(result)
    from ttkbootstrap.dialogs import Messagebox

    Messagebox.okcancel("this is my message")
