#!/usr/bin/python

num_tuples = 1000000
minphonesize = 6
maxphonesize = 8
maxlabelsize = 32
ldh = []
# Letters
for i in range (97, 122):
    ldh.append (chr(i))
# Digits
for i in range (48, 57):
    ldh.append (chr(i))
# Hyphen
ldh.append ('-')

import psycopg2
import random

class ValueGenerator:
    
    def __init__(self):
        self.sent = 0
        self.over = False
        self.result = ""
        self.rand_generator = random.Random()
            
    def read(self, size=None):
        if size is None:
            self.result = ""
            for i in range(self.sent, num_tuples):
                self.result += self.readline()
            return self.result
        else:
            if len(self.result) < size and self.sent >= num_tuples:
                buffer = self.result
                self.result = ""
                return buffer
            while len(self.result) < size and not self.over:
                for i in range(0, 5):
                    nextline = self.readline()
                    if nextline == "":
                        self.over = True
                        break
                    self.result += nextline
            if not self.over:
                buffer = self.result[:size]
                self.result = self.result[size:]
            else:
                buffer = self.result
                self.result = ""
            return buffer

    def readline(self, size=None):
        # Not directly used by psycopg's copy_from, apparently. But we use
        # it internally
        # TODO: handle size != None
        if self.sent < num_tuples:
            person_id = self.rand_generator.randint(1, num_tuples)
            phone_n = self.gen_random_value()
            buffer = "%s\t%s\n" % (person_id, phone_n)
            self.sent += 1
            return buffer
        else:
            return ""

class NumGenerator(ValueGenerator):
    def gen_random_value(self):
        #country = chr(self.rand_generator.choice(range (48, 57))) + \
        #          chr(self.rand_generator.choice(range (48, 57)))
        if self.rand_generator.randint(0, 100) == 0:
            country = chr(self.rand_generator.choice(range (48, 57))) + \
                      chr(self.rand_generator.choice(range (48, 57)))
        else:
            country = "33"
        num = ""
        for i in range(self.rand_generator.randint(minphonesize, maxphonesize)):
            num += chr(self.rand_generator.choice(range (48, 57)))
        return "+" + country + " " + num 

class EmailGenerator(ValueGenerator):

    def gen_random_label(self, max=maxlabelsize):
        label = ""
        for i in range(self.rand_generator.randint(1, max)):
            label = label + self.rand_generator.choice(ldh)
        return label

    def gen_random_value(self):
        tld_dice = self.rand_generator.randint(0, 100)
        if tld_dice < 1:
            tld = ".com"
        elif tld_dice < 2:
            tld = ".de"
        elif tld_dice < 100:
            tld = ".fr"
        else:
            tld = self.gen_random_label(max=4)
        name = self.gen_random_label()
        return name + "@" + self.gen_random_label() + tld

phonedata = NumGenerator()
emaildata = EmailGenerator()
conn = psycopg2.connect("dbname=essais")
curs = conn.cursor()
curs.execute("BEGIN;")
curs.execute("DELETE FROM PhonesPersons")
curs.copy_from(phonedata, 'PhonesPersons')
curs.execute("DELETE FROM EmailsPersons")
curs.copy_from(emaildata, 'EmailsPersons')
curs.execute("COMMIT;")
curs.close()
conn.close()
