"""Setup the pyalchemybiz application"""
import logging

from paste.deploy import appconfig
from pylons import config

from sqlalchemy.exceptions import NoSuchTableError
import sys
from migrate.versioning.api import db_version, version_control, upgrade

from pyalchemybiz.config.environment import load_environment

log = logging.getLogger(__name__)


def setup_app(command, conf, vars):
    """Place any commands to setup pyalchemybiz here"""
    load_environment(conf.global_conf, conf.local_conf)

    repoversion = int(config.get('migrate.repo.version'))
    repodir = config.get('migrate.repo.dir')
    dburl = config.get('sqlalchemy.url')

    # Populate the DB on 'paster setup-app'

    log.info("Setting up database connectivity...")
    log.info("Desired database repository version: %d" % repoversion)
    log.info("Desired database repository directory: %s" % repodir)

    try:
        dbversion = int(db_version(dburl, repodir))
    except NoSuchTableError:
        version_control(dburl, repodir)
        dbversion = int(db_version(dburl, repodir))
    except Exception, e:
        log.error(e)
        raise e
    log.info("detected db version %d" % dbversion)
    if dbversion < repoversion:
        upgrade(dburl, repodir, repoversion)
    elif dbversion > repoversion:
        log.error("The database at %s is already versioned and its version " +
                  "%d is greater than the required version %d",
                  dburl, dbversion, repoversion)
        sys.exit(1)

    log.info("Successfully set up.")