# locale_screen.py

#
# Copyright 2022 axtlos <axtlos@getcryst.al>

#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 3 of the License only.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.


from gi.repository import Gtk, Adw
from gettext import gettext as _
import time, locale
from jade_gui.classes.jade_screen import JadeScreen
from jade_gui.widgets.locale import LocaleEntry
from jade_gui.widgets.selected_locale import SelectedLocale
from jade_gui.utils.gtk_helpers import set_list_text



@Gtk.Template(resource_path="/moe/ewe/os/jadegui/pages/locale/locale_screen.ui")
class LocaleScreen(JadeScreen, Adw.Bin):
    __gtype_name__ = "LocaleScreen"

    event_controller = Gtk.EventControllerKey.new()

    ### Page and widgets on timezone screen
    locale_search_button = Gtk.Template.Child()
    status_page = Gtk.Template.Child()

    main_locale_list = Gtk.Template.Child()
    other_locale_list = Gtk.Template.Child()

    empty_locales = Gtk.Template.Child()

    style_provider = Gtk.CssProvider()
    date_preview = Gtk.Template.Child()
    datespreview = Gtk.Template.Child()
    number_preview = Gtk.Template.Child()
    numberpreview = Gtk.Template.Child()
    chosen_locales = []
    other_locales = []
    move_to_summary = False

    def __init__(self, window, locations, set_valid, application, **kwargs):
        super().__init__(set_valid=set_valid, **kwargs)
        self.window = window
        self.application = application
        self.kwargs = kwargs
        self.style_provider.load_from_data(".emptyLocales { font-style: italic; font-size: 15px; }", -1)
        Gtk.StyleContext.add_provider(
            self.empty_locales.get_style_context(),
            self.style_provider,
            Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
        )

        builder = Gtk.Builder.new_from_resource(
            "/moe/ewe/os/jadegui/pages/locale/locale_dialog.ui"
        )
        self.search_dialog = builder.get_object("search_dialog")

        self.search_dialog.set_transient_for(self.window)
        self.search_dialog.set_modal(self.window)

        self.locale_entry_search = builder.get_object("locale_entry_search")
        self.locale_list = builder.get_object("locale_list")
        self.locale_search = builder.get_object("locale_search")

        self.event_controller.connect("key-released", self.search_locales)
        self.locale_entry_search.add_controller(self.event_controller)
        self.locale_list.connect("row-selected", self.select_locale)
        self.locale_search_button.connect("clicked", self.present_dialog)

        self._locale_list_length = 1
        try:
            self.chosen_locales = [self.window.timezone_screen.chosen_timezone.locale]
        except:
            self.chosen_locales = ["en_US.UTF-8 UTF-8"]

        en_US = LocaleEntry(
            page=self,
            window=window,
            locale="en_US.UTF-8 UTF-8",
            button_group=None,
            application=application,
            **kwargs,
        )
        self.locale_list.append(en_US)
        if(len(self.chosen_locales) <= 0):
            self.chosen_locales.append("en_US.UTF-8 UTF-8")
        set_list_text(self.main_locale_list, self.chosen_locales[0])
        locales=["en_US.UTF-8 UTF-8"] # Keep a list of added locales to avoid duplicates
        for i in locations:
            for locale in i:
                if locale.locales not in locales:
                    row = LocaleEntry(
                        page=self,
                        window=window,
                        locale=locale.locales,
                        button_group=en_US.main_locale_button,
                        application=application,
                        **kwargs,
                    )
                    locales.append(locale.locales)
                    if row.locale in self.chosen_locales[0]:
                        row.main_locale_button.set_active(True)
                    self.locale_list.append(row)
                    self._locale_list_length += 1
        self.update_locale_preview()

    def present_dialog(self, *_):
        self.search_dialog.present()

    def update_from_row(self, row):
        if row.main_locale_button.get_active():
            set_list_text(self.main_locale_list, row.locale)
            for i in self.other_locales:
                if i.locale == row.locale:
                    self.update_selected_locale_list(remove=i.locale, row=i)
                    if self.other_locales == []:
                        self.empty_locales.show()
            self.update_selected_locale_list(main=row.locale)
        else:
            self.empty_locales.set_visible(False)
            locale = SelectedLocale(
                page=self,
                window=self.window,
                locale=row.locale,
                application=self.application,
                **self.kwargs,
            )
            self.update_selected_locale_list(add=row.locale, row=locale)

    def update_locale_preview(self):
        locale.setlocale(locale.LC_ALL, self.chosen_locales[0][:-6])
        self.datespreview.set_label(time.strftime(locale.nl_langinfo(locale.D_T_FMT)))
        # TODO: currency not available
        #self.numberpreview.set_label(locale.format_string("%.2f", 1234567.89, grouping=True)+"  -  "+locale.currency(1234.56, grouping=True))
        self.numberpreview.set_label(locale.format_string("%.2f", 1234567.89, grouping=True))

    def update_selected_locale_list(self, add=None, remove=None, main=None, row=None):
        if main:
            self.chosen_locales[0] = main
            self.set_valid(True)
            self.update_locale_preview()
        if add:
            if add not in self.chosen_locales:
                self.chosen_locales.append(add)
                if row is not None:
                    self.other_locales.append(row)
                    self.other_locale_list.add_row(row)
        if remove:
            if remove != self.chosen_locales[0]:
                self.chosen_locales.remove(remove)
                if row is not None:
                    self.other_locales.remove(row)
                    self.other_locale_list.remove(row)
                if self.other_locales == []:
                    self.empty_locales.show()
            else:
                print("Tried to remove main locale!!")
                return

    def select_locale(self, widget, row):
        self.search_dialog.hide()

        self.status_page.set_description("")
        self.update_from_row(row)

    def search_locales(self, *args):
        terms = self.locale_entry_search.get_text()
        self.locale_list.set_filter_func(self.filter_locales, terms)

    def on_show(self):
        self.chosen_locales = [self.window.timezone_screen.chosen_timezone.locale]
        set_list_text(self.main_locale_list, self.chosen_locales[0])
        self.update_locale_preview()
        if self.chosen_locales != []:
            self.set_valid(True)

    @staticmethod
    def filter_locales(row, terms=None):
        try:
            text = row.get_title()
            text = text.lower() + row.get_subtitle().lower()
            if terms.lower() in text:
                return True
        except:
            return True
        return False
