#!/opt/anaconda1anaconda2anaconda3/bin/python
# -*- coding: utf-8

import sys
import argparse

import anvio.db as db
import anvio.dbops as dbops
import anvio.terminal as terminal 

from anvio.errors import ConfigError


run = terminal.Run()
progress = terminal.Progress()

current_version = '19'
next_version    = '20'


def update_profile_db(profile_db_path, just_do_it = False):
    if profile_db_path is None:
        raise ConfigError("No database path is given.")

    # make sure someone is not being funny
    dbops.is_profile_db(profile_db_path)

    # make sure the version is accurate
    profile_db = db.DB(profile_db_path, None, ignore_version = True)
    if str(profile_db.get_version()) != current_version:
        raise ConfigError("Version of this profile database is not %s (hence, this script cannot really do anything)." % current_version)

    if not just_do_it:
        try:
            run.warning("This script will upgrade your profile database from v%s to v%s. This upgrade will simply remove gene_coverages\
                         table from your profile database. It is OK. You still will be able to access to that type of data. You can just\
                         press ENTER to continue. If you want to cancel the upgrade and think more about it, press CTRL+C now. If you want to avoid\
                         this message the next time, use '--just-do-it'." % (current_version, next_version))
            input("Press ENTER to continue...\n")
        except:
            print()
            sys.exit()

    progress.new("Trying to upgrade the profile database")
    progress.update('...')

    # drop the table
    try:
        profile_db._exec('DROP TABLE gene_coverages;')
    except:
        pass

    # commit
    try:
        profile_db._exec('COMMIT')
    except:
        pass

    # cleanup
    try:
        profile_db._exec('vacuum')
    except:
        pass

    # remove irrelevant self table entry
    try:
        profile_db.remove_meta_key_value_pair('gene_coverages_computed')
    except:
        pass

    # set the version
    profile_db.remove_meta_key_value_pair('version')
    profile_db.set_version(next_version)

    # bye
    profile_db.disconnect()
    progress.end()

    run.info_single('Done! Your profile db is now %s.' % next_version)


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='A simple script to upgrade profile database from version %s to version %s' % (current_version, next_version))
    parser.add_argument('profile_db', metavar = 'PROFILE_DB', help = "An anvi'o profile database of version %s" % current_version)
    parser.add_argument('--just-do-it', default=False, action="store_true", help = "Do not bother me with warnings")
    args = parser.parse_args()

    try:
        update_profile_db(args.profile_db, just_do_it = args.just_do_it)
    except ConfigError as e:
        print(e)
        sys.exit(-1)
