""" Part number generator for EyeRIS project

Use this to create unique part numbers based on the project
number, the index in the database, and the date

By default, this will generate a part number of the form:

<project>-<index>-<date>

The number is inserted into the database and the index
is increamented. Proided the database is not deleted,
each time you run the script a new, unique number 
will be generated.

Author: pldr

Created:        (4/19/2019)
Modified:       (4/23/2019) - Added comments
Modified:       (4/23/2019) - Added option to list numbers with creation datetime
 
"""

import dataset
import argparse
import random
import time
import datetime

# location of the database relative to this script
DATABASE_FILE = 'sqlite:///pngen.db'

# Default to 2 digits for the index or up to 99 parts
DEFAULT_DIGITS = 2

# arg parser to help with input parsing
parser = argparse.ArgumentParser(description='Part Number Generator')
parser.add_argument('ProjectNumber', metavar='Project Number', type=int,
    help='The number of the poject')
parser.add_argument('--digits',default=DEFAULT_DIGITS,
    help='The number of digits in the part number index to generate default: ' + str(DEFAULT_DIGITS))
parser.add_argument('--list',action='store_true',
    help='List all the numbers currently assigned to the given project')
args = parser.parse_args()


# connect to database 
db = dataset.connect(DATABASE_FILE)

# get table for the project number
table = db['PN'+str(args.ProjectNumber)]

# todays date
d = datetime.date.today()

# check if we should just list the number
if args.list:
    print('\n')
    print('Listing existing part numbers for project : ' + str(args.ProjectNumber)) 
    print('\n')
    for entry in table:
        created_datetime = datetime.datetime.utcfromtimestamp(entry['Created']).strftime('%Y-%m-%d %H:%M:%S')
        print(entry['PartNumber'] + ' : Created @ ' + created_datetime)
    print('\n')
    exit()

# format the new part number and insert into the database
format_string = "{:0" + str(args.digits) + "d}"
part_number = str(args.ProjectNumber) + '-' + format_string.format(table.count()) + '-' + d.strftime("%m%d%y")
table.insert(dict(Project=args.ProjectNumber,PartNumber=part_number,Created=time.time()))

# Print the part number to the console
print( 'Your Part Number is: ' + part_number)
