class lattefy():
    def __init__(self):
        #Pushbullet API data
        self.token = "BXRMMQMOGoLoQY4LWLsOOzf8ep3vlD5F"
        self.pb = PushBullet(self.token)
        self.pb.contacts
    
        #Coffee orders array
        self.orders = deque([])
        
        #Setting up SPI connection
        self.SPI_bus = smbus.SMBus(1)
        self.SPI_address = 0x04
        
        #Threading Pushbullet checks
        self.hilo=threading.Thread(target=self.pbCycle)
        self.hilo.start()
        
        #Threading buttons checks
        self.hilo2=threading.Thread(target=self.btnCycle)
        self.hilo2.start()
        
        while True:
            if True:
                if len(self.orders) > 0:
                    try:
                        self.SPI_bus.write_byte(self.SPI_address, self.orders[0]) #Send order number to Arduino
                    except:
                        pass
                    #self.makeOrder(self.orders[0])
                    self.orders.popleft()
                    #time.sleep(5)
                    #self.SPI_bus.write_byte(self.SPI_address, 3) #Ask Arduino to buzz
                    time.sleep(1)
                #else:
                    #self.SPI_bus.write_byte(self.SPI_address, 0) #Send blank
                    #time.sleep(1.5)
            else:
                print("No hay tazas libres")

    def get_sender(self,sender_iden,sender_name,sender_email):
        for contact in self.pb.contacts:
            if contact.email == sender_email:
                return contact
                break
        else:
            success, contact = self.pb.new_contact(sender_name,sender_email)
            return contact
    
    def get_body(self,push):
        try:
            body = push["body"]
            return body
        except:
            return ""
    
    def get_order(self,order):
        if order == "caféconleche":
            return 1
        elif order == "cafésolo":
            return 2
        else:
            return 0
    
    def buzz(self):        
        p = GPIO.PWM(buzzer, 3000)
        p.start(0)
        p.ChangeFrequency(900) #900Hz
        p.ChangeDutyCycle(70)
        time.sleep(0.1)
        p.stop()
        time.sleep(0.1)
        p.start(0)
        p.ChangeFrequency(900)
        p.ChangeDutyCycle(70)
        time.sleep(0.1)
        p.stop()
 
    def pbCycle(self):
        while True:
            success, self.pushes = self.pb.get_pushes()
            #print(self.pushes)
            for push in self.pushes:
                if push["dismissed"] == False:
                    re_body = self.get_body(push)
                    body = re_body.lower()
                    body = body.split(" ")
                    body = "".join(body)
                    sender_iden = push["sender_iden"]
                    sender_name = push["sender_name"]
                    sender_email = push["sender_email"]
                    order_result = self.get_order(body)
                    if order_result > 0:
                        if order_result == 1:
                            print("Preparando café con leche")
                        elif order_result == 2:
                            print("Preparando café solo")
                        self.get_sender(sender_iden,sender_name,sender_email).push_note("¡Orden terminada!","Ya puedes recoger tu {0}".format(re_body))
                        time.sleep(2)
                        self.orders.append(order_result)
                    else:
                        self.get_sender(sender_iden,sender_name,sender_email).push_note("Error","Servicio no reconocido, prueba a pedir un 'café con leche' o un 'café solo'")
                    success_now, pushes_now = self.pb.get_pushes()
                    self.pb.dismiss_push(pushes_now[0]["iden"])
                    self.pb.dismiss_push(push["iden"])
            time.sleep(1)
    
    def btnCycle(self):
        while True:
            if GPIO.input(btn1) == 1:
                self.orders.append(1)
                time.sleep(0.4)
            elif GPIO.input(btn2) == 1:
                self.orders.append(2)
                time.sleep(0.4)
                
    def makeOrder(self,order):
        time.sleep(1)
        if order == 1:
            print("Café")
            print("Liberar café en el filtro")
            self.SPI_bus.write_byte(self.SPI_address, 4) #Servo 0 
            time.sleep(1)
            print("Calentar agua")
            print("Abrir filtro")
            print("Comprobar nivel de la taza")
            time.sleep(1)
            self.SPI_bus.write_byte(self.SPI_address, 5) #Servo 170
            time.sleep(1)
        elif order == 2:
            print("Té")