"""
Controllers/WindowController
============================

.. versionadded:: 1.0.0

Modules and classes that implement useful methods for getting information
about the state of the current application window.

Controlling the resizing direction of the application window
------------------------------------------------------------

.. code-block:: python

    # When resizing the application window, the direction of change will be
    # printed - 'left' or 'right'.

    from kivymd.app import MDApp
    from kivymd.uix.controllers import WindowController
    from kivymd.uix.screen import MDScreen


    class MyScreen(MDScreen, WindowController):
        def on_width(self, *args):
            print(self.get_window_width_resizing_direction())


    class Test(MDApp):
        def build(self):
            return MyScreen()


    Test().run()
"""

from kivy.core.window import Window
from kivy.core.window.window_sdl2 import WindowSDL
from kivy.metrics import dp


class WindowController:
    def __init__(self):
        self.window_resizing_direction = "unknown"
        self.real_device_type = "unknown"
        self.__width = Window.width
        Window.bind(on_resize=self._on_resize)

    def on_size(self, instance, size: list) -> None:
        """Called when the application screen size changes."""

        window_width = size[0]

        if window_width < dp(500):
            self.real_device_type = "mobile"
        elif window_width < dp(1100):
            self.real_device_type = "tablet"
        else:
            self.real_device_type = "desktop"

    def get_real_device_type(self) -> str:
        """Returns the device type - 'mobile', 'tablet' or 'desktop'."""

        return self.real_device_type

    def get_window_width_resizing_direction(self) -> str:
        """Return window width resizing direction - 'left' or 'right'."""

        return self.window_resizing_direction

    def _set_window_width_resizing_direction(self, width: int) -> None:
        if self.__width > width:
            self.window_resizing_direction = "left"
        elif self.__width < width:
            self.window_resizing_direction = "right"

    def _on_resize(
        self, window_sdl2: WindowSDL, width: int, height: int
    ) -> None:
        self._set_window_width_resizing_direction(width)
        self.__width = width