#!/usr/bin/python3
# -*- coding:utf-8 -*-

# Codé par PAC , forké de 20-100

""" Module pour dialoguer avec la NoteKfet2015 """

import socket
import json
import ssl
import traceback


def get_response(socket):
    length_str = b""
    char = socket.recv(1)
    while char != b"\n":
        length_str += char
        char = socket.recv(1)
    total = int(length_str)
    return json.loads(socket.recv(total).decode("utf-8"))


def connect(server, port):
    sock = socket.socket()
    try:
        # On établit la connexion sur port 4242
        sock.connect((server, port))
        # On passe en SSL
        sock = ssl.wrap_socket(sock)
        # On fait un hello
        sock.send(b'["hello", "manual"]')
        retcode = get_response(sock)
    except:
        # Si on a foiré quelque part, c'est que le serveur est down
        return (False, sock, "Serveur indisponible")
    return (True, sock, "")


def login(server, port, username, password, masque=[[], [], True]):
    result, sock, err = connect(server, port)
    if not result:
        return (False, None, err)
    try:
        commande = ["login", [username, password, "bdd", masque]]
        sock.send(json.dumps(commande).encode("utf-8"))
        response = get_response(sock)
        retcode = response["retcode"]
        if retcode == 0:
            return (True, sock, "")
        elif retcode == 5:
            return (False, sock, "Login incorrect")
        else:
            return (False, sock, "Erreur inconnue " + str(retcode))
    except:
        # Si on a foiré quelque part, c'est que le serveur est down
        return (False, sock, "Erreur de communication avec le serveur")


def don(sock, montant, id_note, facture):
    """
    Faire faire un don à l'id_note
    """
    try:
        sock.send(
            json.dumps(
                [
                    "dons",
                    [
                        [id_note],
                        round(montant * 100),
                        "Facture : id=%s, designation=%s"
                        % (facture.id, facture.name()),
                    ],
                ]
            ).encode("utf-8")
        )
        response = get_response(sock)
        retcode = response["retcode"]
        transaction_retcode = response["msg"][0][0]
        if (
            0 < retcode < 100
            or 200 <= retcode
            or 0 < transaction_retcode < 100
            or 200 <= transaction_retcode
        ):
            return (False, "Transaction échouée. (Solde trop négatif ?)")
        elif retcode == 0:
            return (True, "")
        else:
            return (False, "Erreur inconnue " + str(retcode))
    except:
        return (False, "Erreur de communication avec le serveur")