#!/usr/bin/python
import sys
import logging
from time import time
from optparse import OptionParser

from sudokulib.grid import InvalidGrid
from sudokulib.solver import SudokuSolver


if __name__ == '__main__':
    parser = OptionParser(usage='usage: %prog [options] source')
    parser.add_option('-f', '--free', dest='free_char', type='string',
                      help='The character signaling free place', default='.')
    parser.add_option('--nobacktracking', action='store_false',
                      dest='backtracking', default=True,
                      help='Do not use backtracking for finding solution')
    parser.add_option('-v', '--verbosity', action='count', dest='verbosity',
                      help='Increase verbosity (specify multiple times for more)')

    (options, args) = parser.parse_args()

    if not len(args):
        sys.exit('No source file provided')

    source = args[0]
    verbosity = options.verbosity

    start_time = time()

    solver_kw = {'free_char': options.free_char}
    if not options.backtracking:
        solver_kw['backtracking_solver_class'] = None

    try:
        solver = SudokuSolver(source, **solver_kw)
    except InvalidGrid, e:
        sys.exit(e)

    if verbosity == 1:
        print '%s items missing' % solver.grid.missing
    elif verbosity >= 2:
        console = logging.StreamHandler(sys.stdout)
        logger = logging.getLogger('sudokulib')
        logger.addHandler(console)
        if verbosity == 2:
            logger.setLevel(logging.INFO)
        else:
            logger.setLevel(logging.DEBUG)

    solver.run()

    if verbosity >= 2:
        print '%s items missing' % solver.grid.missing
    print solver
    if verbosity:
        print 'Solved in %s seconds' % (time() - start_time)
