from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.scrollview import ScrollView
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.textinput import TextInput
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.clock import Clock

from kivy.properties import ColorProperty

class ScalableLabel(Label):
    background_color = ColorProperty('black')  # this lets you use color names in kv or python.

class MyScrollView(ScrollView):
    pass

class FixedTextinput(TextInput):
    pass

Builder.load_string('''
#:set my_font_size sp(15)
#:set large_font_size sp(30)
#:set my_padding dp(10)
#:set my_bar_color [.3, .3, .3, .9]
#:set white 1, 1, 1, 1
#:set black 0, 0, 0, 1

<ScalableLabel>:
    text: '(...)'  # Will be set later in Python.
    font_size: my_font_size
    text_size: self.width, None
    size_hint_y: None
    padding: (my_padding,my_padding)
    height: self.texture_size[1]
    background_color: [0, 0, 0, 1]
    canvas.before:
        Color:
            rgba: root.background_color
        Rectangle:
            size: self.size
            pos: self.pos

<MyScrollView>:
    do_scroll_x: False
    do_scroll_y: True
    bar_color: my_bar_color
    bar_inactive_color: my_bar_color
    bar_width: 0.6 * my_padding
    canvas.before:
        Color:
            rgba: 0.9, 0.9, 0.9, 1
        Rectangle:
            size: self.size
            pos: self.pos

<FixedTextinput>:
    text: ''
    multiline: False
    size_hint_y: None
    height: self.minimum_height
''')

class MyApp(App):
    def build(self):
        # Main layout
        self.root_layout = BoxLayout(orientation='vertical')

        # ScrollView with content
        self.scroll_view = MyScrollView(size_hint=(1, 1))
        self.content_layout = BoxLayout(orientation='vertical', size_hint_y=None)
        self.content_layout.bind(minimum_height=self.content_layout.setter('height'))
        new_target_prompt = ScalableLabel(text="sdgfh sdfh dsfgh dsfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg "
                                               "sdfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg "
                                               "sdfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg "
                                               "sdfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg sdfg")
        self.content_layout.add_widget(new_target_prompt)

        # Add TextInputs to the layout
        for i in range(6):
            label = ScalableLabel(text=f"Label {i+1}..:")
            self.content_layout.add_widget(label)
            text_input = FixedTextinput(size_hint_y=None, height=50, multiline=False)
            self.content_layout.add_widget(text_input)

        self.scroll_view.add_widget(self.content_layout)
        self.root_layout.add_widget(self.scroll_view)

        # Bind keyboard events
        Window.bind(on_keyboard=self.keyboard_event)
        Window.bind(on_resize=self.resize_event)

        return self.root_layout

    def keyboard_event(self, window, height, key_height, *args):
        Clock.schedule_once(lambda dt: self.adjust_for_keyboard(key_height), 0)

    def resize_event(self, window, width, height):
        Clock.schedule_once(lambda dt: self.adjust_for_keyboard(0), 0)  # Reset layout on resize

    def adjust_for_keyboard(self, key_height):
        if key_height > 0:
            # Keyboard is visible, adjust the height
            self.scroll_view.size_hint_y = None
            self.scroll_view.height = Window.height - key_height
        else:
            # Keyboard is hidden, reset to use full window height
            self.scroll_view.size_hint_y = 1
            self.scroll_view.height = Window.height

if __name__ == "__main__":
    MyApp().run()
