from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.button import Button
from kivy.uix.image import Image
from kivy.graphics.texture import Texture
from kivy.clock import Clock
from kivy.metrics import dp
from kivy.properties import StringProperty
import JsonUtl as jsonutil
import cv2

from kivy.uix.boxlayout import BoxLayout


class MainScreen(Screen):
    ServerListVar = jsonutil.OpenJsontoArray() 
    BtnId = 0
    DelBtnId = 0
    textures = []

    def __init__(self, **kw):
        super().__init__(**kw)
        for i in range (0,len(self.ServerListVar)):
            self.CreateButtons(i)

    def Clicked(self,widget):
        Adress = self.ids.StreamAdress
        if not Adress.text == "":
            self.ServerListVar.append(Adress.text.strip())
            jsonutil.SaveArraytoJson(self.ServerListVar)
            self.CreateButtons(len(self.ServerListVar)- 1)
    
    def CamSelectButtonPressed(self,x):
            app = App.get_running_app()
            app.data = self.ServerListVar[x]
            app.root.current = "Stream"  

    def CamDeleteButtonPressed(self,x):
        del self.ServerListVar[x]
        self.ids.CamSelectStackLayout.clear_widgets()
        jsonutil.SaveArraytoJson(self.ServerListVar)
        self.ServerListVar = jsonutil.OpenJsontoArray() 
        self.BtnId = 0
        self.DelBtnId = 0
        for i in range (0,len(self.ServerListVar)):
            self.CreateButtons(i)
    
    def CreateButtons(self, i):
        b = Button(size_hint = (None, None),width= dp(200), height = dp(200),text = self.ServerListVar[i], font_size = 10)
        b2 = Button(size_hint = (None, None),width = dp(50), height = dp(200), background_color = (1,0,0,1))
        b.bind(on_press=lambda instance, button_id=self.BtnId: self.CamSelectButtonPressed(button_id))
        self.BtnId = self.BtnId + 1
        self.ids.CamSelectStackLayout.add_widget(b) 
        b2.bind(on_press=lambda instance, button_id=self.DelBtnId: self.CamDeleteButtonPressed(button_id))
        self.DelBtnId = self.DelBtnId + 1
        self.ids.CamSelectStackLayout.add_widget(b2) 

class StreamView(Screen): 
    output = StringProperty() 
    event = None
    def on_enter(self):
        app = App.get_running_app()
        self.output = app.data
        self.capture = cv2.VideoCapture(self.output)  
        b = Button(size_hint = (0.05, 0.05), pos_hint = {"top":1}, background_color = (1,0,0,1))
        b.bind(on_press=lambda instance, button_id="i": gotomainscreen(button_id))
        self.add_widget(b) 
        self.image = Image()
        self.add_widget(self.image)
        self.event = Clock.schedule_interval(self.update, 1.0 / 30.0) 

        def gotomainscreen(x):
            app = App.get_running_app()
            app.root.current = "Main"

    def update(self, dt):
        ret, frame = self.capture.read()
        if ret:
            buf = cv2.flip(frame, 0).tostring()  
            texture = Texture.create(size=(frame.shape[1], frame.shape[0]), colorfmt='bgr')
            texture.blit_buffer(buf, colorfmt='bgr', bufferfmt='ubyte')
            self.image.texture = texture

    def on_leave(self):
        self.capture.release()
        self.event.cancel()
        cv2.destroyAllWindows()

class ScreenMan(ScreenManager):
    pass

class IPCAMApp(App):
    def build(self):
        sm = ScreenMan()
        sm.add_widget(MainScreen(name="Main"))
        sm.add_widget(StreamView(name="Stream"))
        sm.current = "Main" 
        return sm
    

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