from objects import Enterprise, Employee

from ZODB import DB, Connection
from ZODB.FileStorage import FileStorage
import transaction

import threading
import time
import random


def print_enterprise(enterprise):
    print "-------------------- DATA FROM DB"
    enterprise.print_state()
    print "-------------------- END DATA FROM DB"


def build_enterprise():
    enterprise = Enterprise("Microsoft")
    enterprise.add_employee(Employee("Numero1", 1))
    enterprise.add_employee(Employee("Numero2", 2))
    enterprise.add_employee(Employee("Numero3", 3))
    enterprise.add_employee(Employee("Numero4", 4))
    enterprise.add_employee(Employee("Numero5", 5))

    return enterprise


def thread_1(enterprise, employees, number):
    print "starting thread"
    #db.
    #connection_ = Connection(db)
    storage = FileStorage("/tmp/asdasd.fs")
    db = DB(storage)
    connection = db.open()
    root = connection.root()
    n = number
    for e in employees:
        print "modifying Name on thread" # Employee {0}".format(e)
        e._name = "name{0}".format(n)
        transaction.commit()
        time.sleep(random.random())
    print "finishing thread"


def main():
    # setup the database
    storage = FileStorage("/tmp/asdasd.fs")
    db = DB(storage)
    connection = db.open()
    root = connection.root()
    if "number" not in root:
        root["number"] = 0
    root["number"] += 1
    transaction.commit()
    number = root["number"]
    if "enterprise" not in root:
        root["enterprise"] = build_enterprise()
        transaction.commit()
    enterprise = root["enterprise"]

    print_enterprise(enterprise)

    employees = enterprise._employees
    new_thread = threading.Thread(target=thread_1, args=[enterprise, employees,
                                                         number])
    new_thread.start()
    for e in employees:
        new_age = random.randint(0, 100)
        print "Changing AGE to employee: {0} to:'{1}'".format(e, new_age)
        e._age = new_age
        transaction.commit()
        time.sleep(random.random())


if __name__ == "__main__":
    main()