from xbmcgui import Dialog

from lib.api.plex.media_server import check_server_connection, get_servers
from lib.api.plex.plex import PlexApi
from lib.utils.kodi.utils import get_setting, kodilog, set_setting

plex = PlexApi()

server_config = {"discoveryUrl": [], "streamingUrl": []}


def plex_login():
    success = plex.login()
    if success:
        user = plex.get_plex_user()
        if user:
            set_setting("plex_user", user.username)


def validate_server():
    servers = get_servers("https://plex.tv/api/v2", get_setting("plex_token"))
    if servers:
        server_names = [s.name for s in servers]
        chosen_server = Dialog().select("Select server", server_names)
        if chosen_server < 0:
            return
        for s in servers:
            if s.name == server_names[chosen_server]:
                set_setting("plex_server_name", s.name)
                set_setting("plex_server_token", s.access_token)
                for c in s.connections:
                    server_config["streamingUrl"].append(c["uri"])
                    if c["local"] is not True:
                        server_config["discoveryUrl"].append(c["uri"])
                break
    discovery_test(server_config["discoveryUrl"], get_setting("plex_server_token"))
    streaming_test(server_config["streamingUrl"], get_setting("plex_server_token"))


def discovery_test(urls, access_token):
    kodilog("Making discovery test...")
    kodilog(urls)
    for url in urls:
        success = check_server_connection(url, access_token)
        if success:
            set_setting("plex_discovery_url", url)
            break


def streaming_test(urls, access_token):
    kodilog("Making streaming test...")
    kodilog(urls)
    for url in urls:
        success = check_server_connection(url, access_token)
        if success:
            set_setting("plex_streaming_url", url)
            break


def plex_logout():
    plex.logout()
