import struct
import random
import logging

from google.appengine.ext import db

class HourBill(db.Model):
  serial = db.StringProperty()
  userid = db.IntegerProperty()
  value = db.IntegerProperty()
  spent = db.BooleanProperty()
  created = db.DateTimeProperty(auto_now_add=True)

  def __repr__(self):
    return "<HourBill[%s, %s]>" % (self.serial, self.key().name())

def test():
  bills=HourBill.all().fetch(1000)
  for bill in bills:
    logging.info("Test Bill: "+str(bill))
    bill.delete()

def generateSerial():
  r=random.random()
  l=random.getrandbits(160)
  s=hex(l)[2:-1].rjust(40, '0')
  return "OSC-"+s

def getBySerial(serial):
  return HourBill.get_by_key_name(serial)

def mint(userid, value):
  serial=generateSerial()
  bill=HourBill.get_or_insert(serial, serial=serial, userid=userid, value=value, spent=False)
  bill.put()
  logging.info("bill: "+str(bill))
  logging.info("bill key: "+str(bill.key()))
  logging.info("bill key name: "+str(bill.key().name()))
  return str(bill.key().name())

def verify(serial):
  bill=getBySerial(serial)
  if not bill:
    logging.error("No such bill! "+str(serial))
    return None

  if bill.spent:
    logging.error("Double spending! "+str(serial))
    return None

  return bill

def spend(serial):
  bill=verify(serial)
  if bill:
    bill.spent=True
    bill.put()
  else:
    logging.error("Bill could not be verified "+str(serial))
