 #!/usr/bin/env python
from __future__ import print_function
import sys
import datetime

import grpc

import biometrica_pb2
import biometrica_pb2_grpc


class BiometricaClient:
    timeout = 6000

    def __init__(self, ip, port, secret):
        self.channel = self.GetInsecureChannel(ip, port)
        self.secret = secret

    """
    init client, register terminal
    """

    def Start(self):
        self.client = biometrica_pb2_grpc.BmAuthStub(self.channel)
        self.RegisterTerminal(self.secret, self.client)

    def GetInsecureChannel(self, ip, port):
        URL = ip + ":" + port
        return grpc.insecure_channel(URL)

    """
    RegisterTerminal with console print
    return bool 
    """

    def RegisterTerminalVerbose(self, secret, client):
        try:
            print(
                "Terminal Secret: "
                + secret
                + "\t"
                + datetime.datetime.now().strftime("%H:%M:%S")
            )
            response = client.RegisterTerminal(
                biometrica_pb2.TerminalRequest(secret=secret), BiometricaClient.timeout
            )
            print(
                "Terminal Status: "
                + response.message
                + "\t"
                + datetime.datetime.now().strftime("%H:%M:%S")
            )
            print(" ")

            return response.registered
        except Exception as inst:
            print(type(inst))  # the exception instance
            print(inst.args)  # arguments stored in .args
            print(inst)

    """
    return bool
    """

    def RegisterTerminal(self, secret, client):
        try:
            response = client.RegisterTerminal(
                biometrica_pb2.TerminalRequest(secret=secret), BiometricaClient.timeout
            )
            return response.registered
        except Exception as inst:
            print(type(inst))  # the exception instance
            print(inst.args)  # arguments stored in .args
            print(inst)

    """
    CardAuth with console print
    returns bool
    """

    def CardAuthVerbose(self, uid):
        try:
            print(
                "Requested card: "
                + uid
                + "\t"
                + datetime.datetime.now().strftime("%H:%M:%S")
            )
            response = self.client.CardAuth(
                biometrica_pb2.CardRequest(uid=uid), BiometricaClient.timeout
            )
            print(
                "CardAuth: "
                + response.message
                + "\t"
                + datetime.datetime.now().strftime("%H:%M:%S")
            )
            print(" ")

            return response.auth
        except Exception as inst:
            print(type(inst))  # the exception instance
            print(inst.args)  # arguments stored in .args
            print(inst)

    def CardAuth(self, uid):
        try:
            response = self.client.CardAuth(
                biometrica_pb2.CardRequest(uid=uid), BiometricaClient.timeout
            )
            return response.auth
        except Exception as inst:
            print(type(inst))  # the exception instance
            print(inst.args)  # arguments stored in .args
            print(inst)

    def CardTAuthVerbose(self, uid, ticket):
        try:
            print(
                "Requested card: "
                + uid
                + "\t"
                + datetime.datetime.now().strftime("%H:%M:%S")
            )
            response = self.client.CardTAuth(
                biometrica_pb2.CardTRequest(uid=uid, ticket=ticket),
                BiometricaClient.timeout,
            )

            # print(str(response))

            print(
                "CardAuth: "
                + response.message
                + "\t"
                + "ticket: "
                + str(response.ticket)
                + "\t"
                + datetime.datetime.now().strftime("%H:%M:%S")
            )
            print(" ")

            return [response.auth, response.ticket]
        except Exception as inst:
            print(type(inst))  # the exception instance
            print(inst.args)  # arguments stored in .args
            print(inst)

    # returns [bool, int]
    # bool -- auth, int -- ticket
    def CardTAuth(self, uid, ticket):
        try:
            response = self.client.CardTAuth(
                biometrica_pb2.CardTRequest(uid=uid, ticket=ticket),
                BiometricaClient.timeout,
            )
            return [response.auth, response.ticket]
        except Exception as inst:
            print(type(inst))  # the exception instance
            print(inst.args)  # arguments stored in .args
            print(inst)

    def FingerAuth(self, finger):
        try:
            response = self.client.FingerAuth(
                biometrica_pb2.FingerRequest(fingerprint=finger),
                BiometricaClient.timeout,
            )
            return response.auth
        except Exception as inst:
            print(type(inst))  # the exception instance
            print(inst.args)  # arguments stored in .args
            print(inst)

    def FingerAuthVerbose(self, finger):
        try:
            print(
                "Requested Fingerprint ByteLength: "
                + str(len(finger))
                + "\t"
                + datetime.datetime.now().strftime("%H:%M:%S")
            )
            response = self.client.FingerAuth(
                biometrica_pb2.FingerRequest(fingerprint=finger),
                BiometricaClient.timeout,
            )
            print(
                "Finger Status: "
                + response.message
                + "\t"
                + datetime.datetime.now().strftime("%H:%M:%S")
            )
            print(" ")
            return response.auth
        except Exception as inst:
            print(type(inst))  # the exception instance
            print(inst.args)  # arguments stored in .args
            print(inst)

    def FingerTAuth(self, finger, ticket):
        try:
            response = self.client.FingerTAuth(
                biometrica_pb2.FingerTRequest(fingerprint=finger, ticket=ticket),
                BiometricaClient.timeout,
            )
            return [response.auth, response.ticket]
        except Exception as inst:
            print(type(inst))  # the exception instance
            print(inst.args)  # arguments stored in .args
            print(inst)

    def FingerTAuthVerbose(self, finger, ticket):
        try:
            print(
                "Requested Fingerprint ByteLength: "
                + str(len(finger))
                + "\t ticket:"
                + str(ticket)
                + "\t"
                + datetime.datetime.now().strftime("%H:%M:%S")
            )
            response = self.client.FingerTAuth(
                biometrica_pb2.FingerTRequest(fingerprint=finger, ticket=ticket),
                BiometricaClient.timeout,
            )
            print(
                "Finger Status: "
                + response.message
                + "\t ticket:"
                + str(response.ticket)
                + "\t"
                + datetime.datetime.now().strftime("%H:%M:%S")
            )
            print(" ")
            return [response.auth, response.ticket]
        except Exception as inst:
            print(type(inst))  # the exception instance
            print(inst.args)  # arguments stored in .args
            print(inst)

    def GetNewTicket(self):
        try:
            response = self.client.GetNewTicket(
                biometrica_pb2.TicketRequest(), BiometricaClient.timeout
            )
            return [response.status, response.ticket]
        except Exception as inst:
            print(type(inst))  # the exception instance
            print(inst.args)  # arguments stored in .args
            print(inst)

    def GetNewTicketVerbose(self):
        try:
            print(
                "Requested new ticket "
                + "\t"
                + datetime.datetime.now().strftime("%H:%M:%S")
            )
            response = self.client.GetNewTicket(
                biometrica_pb2.TicketRequest(), BiometricaClient.timeout
            )
            print(
                "Ticket Status: "
                + response.message
                + "\t ticket:"
                + str(response.ticket)
                + "\t"
                + datetime.datetime.now().strftime("%H:%M:%S")
            )
            print(" ")
            return [response.status, response.ticket, response.message]
        except Exception as inst:
            print(type(inst))  # the exception instance
            print(inst.args)  # arguments stored in .args
            print(inst)

    def SendPhoto(self, string, ticket, type='base64'):
        try:
            response = self.client.SendPhoto(biometrica_pb2.PhotoRequest(photo=string, type=type,ticket=ticket))
            return [response.status, response.ticket]
        except Exception as inst:
            print(type(inst))  # the exception instance
            print(inst.args)  # arguments stored in .args
            print(inst)


    def run():
        ip = "localhost"
        #ip = "192.168.137.10"
        port = "50051"
    # ip = "localhost"
        # port = "13986"
        # secret = "qwerty123"
        secret = "qwerty123"
        # f = open("finger.txt", "rb")
        # finger = f.read()
        finger = "04"

        client = BiometricaClient(ip, port, secret)
        client.Start()
        client.CardAuthVerbose("465465576")
        client.CardAuthVerbose("984635009")
        client.FingerAuthVerbose(finger)

        ticket = client.GetNewTicketVerbose()[1]
        print(str(ticket))


        client.CardTAuthVerbose("984635009", ticket)
        client.FingerTAuthVerbose(finger, ticket)
        client.SendPhoto("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",ticket)

        client.FingerTAuthVerbose("03", ticket)


if __name__ == "__main__":
    BiometricaClient.run()
