import os
import asyncio
import http.server
import socketserver
import streamlit as st

servers = []
clients = []
inputs = []
outputs = []
states = []
used_ports = []
connections = []
server_ports = []
client_ports = []

st.set_page_config(layout="wide")

if "http_server" not in st.session_state:
    
    PORT = 8001
    Handler = http.server.SimpleHTTPRequestHandler
    st.session_state.http_server = PORT

    with socketserver.TCPServer(("", PORT), Handler) as httpd:
        print("serving at port", PORT)
        httpd.serve_forever()

if "client_state" not in st.session_state:
    st.session_state.client_state = "complete"
if "server_state" not in st.session_state:
    st.session_state.server_state = "complete"          

# Wyświetlanie danych, które mogą być modyfikowane na różnych stronach
server_status1 = st.status(label="websocket servers", state=st.session_state.server_state, expanded=False)
server_status = st.sidebar.status(label="websocket servers", state=st.session_state.server_state, expanded=False)
server_status1.write(servers)
server_status.write(servers)

client_status1 = st.status(label="websocket clients", state=st.session_state.client_state, expanded=False)
client_status = st.sidebar.status(label="websocket clients", state=st.session_state.client_state, expanded=False)
client_status1.write(clients)
client_status.write(clients)

async def main():

    # Inicjalizacja danych w st.session_state
    if "server_ports" not in st.session_state:
        st.session_state['server_ports'] = ""
    if "client_ports" not in st.session_state:
        st.session_state["client_ports"] = ""
    if "servers" not in st.session_state:
        st.session_state['servers'] = servers
    if "clients" not in st.session_state:
        st.session_state["clients"] = clients
    if "user_ID" not in st.session_state:
        st.session_state.user_ID = ""
    if "gradio_Port" not in st.session_state:
        st.session_state.gradio_Port = ""              
    if "googleAPI" not in st.session_state:
        st.session_state.googleAPI = ""
    if "cseID" not in st.session_state:
        st.session_state.cseID = ""
    if "server" not in st.session_state:
        st.session_state.server = False    
    if "client" not in st.session_state:
        st.session_state.client = False
    if "client_state" not in st.session_state:
        st.session_state.client_state = "complete"
    if "server_state" not in st.session_state:
        st.session_state.server_state = "complete"        


    st.title("NeuralGPT")

    c1, c2 = st.columns(2)

    with c1:
        st.text("Server ports")
        srv_state = st.empty()
        server_status1 = srv_state.status(label="active servers", state=st.session_state.client_state, expanded=False)
        if st.session_state.server == True:
            st.session_state.server_state = "running"
            server_status1.update(state=st.session_state.client_state, expanded=True)
            server_status1.write(servers)

    with c2:   
        st.text("Client ports")        
        cli_state = st.empty()
        client_status1 = cli_state.status(label="active clients", state=st.session_state.client_state, expanded=False)
        if st.session_state.client == True:    
            st.session_state.client_state = "running"
            client_status1.update(state=st.session_state.client_state, expanded=True)
            client_status1.write(clients)

    with st.sidebar:

        srv_sidebar = st.empty()
        cli_sidebar = st.empty()        
        server_status = srv_sidebar.status(label="los serveros", state=st.session_state.client_state, expanded=True)
        client_status = cli_sidebar.status(label="los clientos", state=st.session_state.client_state, expanded=False)
        server_status.write(servers)
        client_status.write(clients)

        if st.session_state.server == True:
            srv_sidebar.empty()
            st.session_state.server_state = "running"
            server_status = srv_sidebar.status(label="servers", state=st.session_state.client_state, expanded=True)
            server_status.write(servers)

        if st.session_state.client == True:
            cli_sidebar.empty()
            st.session_state.client_state = "running"
            client_status = cli_sidebar.status(label="clients", state=st.session_state.client_state, expanded=True)
            client_status.write(clients)

# Uruchomienie aplikacji
asyncio.run(main())