import csv
from hashlib import sha384

FILE = 'database.csv'
DATABASE = []

def strhash (v):
  return sha384 (v.encode()).hexdigest()

def write_db ():
  """ Stores the DATABASE into FILE. 
      FILE contents will be rewritten.
  """
  with open (FILE, 'w', newline='') as csvfile:
    writer = csv.writer(csvfile, delimiter=',', quotechar='"')
    writer.writerows (DATABASE)

def load_db ():
  """ Loads data from FILE into DATABASE list.
      DATABASE will be emptied before loading.
  """
  DATABASE.clear()
  with open(FILE, newline='') as csvfile:
    reader = csv.reader(csvfile, delimiter=',', quotechar='"')
    for row in reader:
        tr = [row[0], row[1], int(row[2]), row[3], row[4]]
        DATABASE.append (tr)

def hash_tr (tr, prevh):
  h = strhash (tr[0] + ',' + tr[1] + ',' + str(tr[2]) + ',' + tr[3] + ',' + prevh)
  return h

def add (person1, person2, amount, date):
  if len (DATABASE) == 0:
    prevh = ''
  else:
    prevh = DATABASE[-1][4]
  tr = [person1, person2, amount, date]
  DATABASE.append ([person1, person2, amount, date, hash_tr(tr, prevh)])
  write_db()

def list_transactions ():
  load_db()
  for l in DATABASE:
    print (l)

def verify ():
  load_db()
  prevh = ''
  for tr in DATABASE:
    stored_hash = tr[4]
    if hash_tr (tr, prevh) != stored_hash:
      print ('ERROR: there is problem with the transaction')
      print (tr)
      return False
    prevh = stored_hash
  print ('All is good')
  return True

def balance (person):
  b = 0
  for tr in DATABASE:
    if tr[0] == person:
      b = b - tr[2]
    if tr[1] == person:
      b = b + tr[2]
  return b


if __name__ == '__main__':
  load_db()
  list_transactions()
  add('A','B',1233,'today')
  add('A','C',200,'today')
  verify()
  write_db()
