from app_instance import api

from wiz_game import the_game
from starlette.websockets import WebSocketDisconnect
import asyncio
import json


playing_lock = asyncio.Lock()


@api.route("/player/{player}")
def show(req, resp, player: str):
    p = int(player)
    tcard = the_game.trump_card
    tcolor = the_game.get_trump_color()
    try:
        isActive = the_game.players_ordered[the_game.active_player].id == p
    except IndexError:
        isActive = False

    prev_player = the_game.get_prev_player()
    if tcard and tcard.value == 'Z' and tcolor == '-':
        choose_trump_color = True
    else:
        choose_trump_color = False
    resp.content = api.template('home/player.html', player=p, playerActive=isActive, choose_trump_player=prev_player,
                                cards=the_game.players[p].cards, choose_trump_color=choose_trump_color,
                                trump_card=tcard, trump_color=tcolor, played_cards=the_game.played_cards, last_trick=the_game.last_trick)


async def play_card(player, card):
    global playing_lock
    async with playing_lock:
        try:
            isActive = the_game.players_ordered[the_game.active_player].id == player
        except IndexError:
            isActive = False
        if isActive:
            the_game.play_card(player, card)
            if the_game.is_round_finished():
                trick_winner, highest_card = the_game.get_trick_winner()
                trick_winner.take_trick()
            elif the_game.is_trick_finished():
                trick_winner, highest_card = the_game.get_trick_winner()
                trick_winner.take_trick()
                the_game.next_trick()
    await the_game.send_page_reload()


@api.route("/player/{player}/play/{card}")
async def play(req, resp, player: str, card: str):
    p = int(player)
    c = int(card)
    play_card(p, c)
    url = '/player/'+player
    api.redirect(resp, url, status_code=303)

@api.route("/player/{player}/set_trump/{trump}")
async def set_trump_color_rest(req, resp, player, trump):
    p = int(player)
    the_game.set_trump_color(trump)
    url = '/player/'+player
    await the_game.send_page_reload()
    api.redirect(resp, url, status_code=303)

async def set_trump_color(player, color):
    p = int(player)
    if p == the_game.players_ordered[-1].id:
        the_game.set_trump_color(color)
        await the_game.send_page_reload()

@api.route('/ws', websocket=True)
async def websocket(ws):
    await ws.accept()
    the_game.websockets.append(ws)
    try:
        x = await ws.receive_json()
        fct = x['fct']
        if fct == 'playcard':
            p = int(x['player'])
            c = int(x['card'])
            await play_card(p, c)
        elif fct == 'setTrumpColor':
            player = x['player']
            color = x['color']
            await set_trump_color(player, color)
        else:
            print("confused :(")

    #     cmd = await ws.receive_text()
    #     fct, args = cmd.split()
    #     if fct == "playcard":
    #         p, c = map(int, args.split(':'))
    #         await play_card(p, c)
    #     elif fct == "setTrumpColor":
    #         player, color = args.split(':')
    #         await set_trump_color(player, color)


    except WebSocketDisconnect:
        the_game.websockets.remove(ws)

