import requests, json
from urllib.parse import urlencode
from functools import wraps
from . import api

# This must be set to be able to use it on remote hosts
BASE_URL = "http://localhost:8080/api"
def set_endpoint(base_url:str):
    global BASE_URL
    BASE_URL = base_url

# Exceptions:
class APIError(Exception): pass

# decorator:
# (TODO): Add logging
def request_delete(func):
    @wraps(func)
    def new_func(*args, **kwargs):
        url, data = func(*args, **kwargs)
        if type(data) is dict: data = json.dumps(data)
        response = requests.delete(f"{BASE_URL}/{url}", data=data)
        data = json.loads(response.text)
        if "error" not in data or data["error"] != False:
            print(data)
            raise APIError(data["error"])
        return data["success"]
    return new_func
def request_post(func):
    @wraps(func)
    def new_func(*args, **kwargs):
        url, data = func(*args, **kwargs)
        if type(data) is dict: data = json.dumps(data)
        response = requests.post(f"{BASE_URL}/{url}", data=data)
        data = json.loads(response.text)
        if "error" not in data or data["error"] != False:
            print(data)
            raise APIError(data["error"])
        return data["success"]
    return new_func
def request_get(func):
    @wraps(func)
    def new_func(*args, **kwargs):
        url = func(*args, **kwargs)
        response = requests.get(f"{BASE_URL}/{url}")
        data = json.loads(response.text)
        if "error" not in data or data["error"] != False:
            raise APIError(data["errortext"])
        return data["value"]
    return new_func

# methods:

@request_post
def load_path(path:str, data:dict=None):
    args = urlencode(locals())
    return f"load?{args}", data

@request_get
def is_playing():
    return f"play"

@request_post
def set_playing(play:bool):
    args = urlencode(locals())
    return f"play?{args}", None

@request_get
def get_volume():
    return f"volume"

@request_post
def set_volume(volume:int):# between 0 and 100 (you may also exceed 100)
    args = urlencode(locals())
    return f"volume?{args}", None

@request_get
def get_playlist():
    return f"playlist"

@request_post
def playlist_next():
    return f"playlist/next", None

@request_post
def playlist_goto(index:int):
    args = urlencode(locals())
    return f"playlist/goto?{args}", None

@request_post
def playlist_previous():
    return f"playlist/previous", None

@request_post
def playlist_shuffle():
    return f"playlist/shuffle", None

@request_delete
def playlist_clear():
    return f"playlist", None

@request_delete
def playlist_remove(index:int):
    args = urlencode(locals())
    return f"playlist?{args}", None

@request_post
def playlist_move(index1:int, index2:int):
    args = urlencode(locals())
    return f"playlist/move?{args}", None

@request_get
def get_playlist_looping():
    return f"playlist/loop"

@request_post
def playlist_set_looping(looping:bool):
    return f"playlist/loop?loop={str(bool(looping)).lower()}", None


@request_get
def get_playback_pos():
    return f"time"

@request_post
def seek_absolute(pos:float):
    args = urlencode(locals())
    return f"time?{args}", None

@request_post
def seek_percent(percent:int):
    args = urlencode(locals())
    return f"time?{args}", None
