import argparse
import os
import sys
from configparser import ConfigParser

from sqlalchemy import (
    create_engine,
    MetaData,
)
from sqlalchemy.orm import (
    scoped_session,
    sessionmaker,
)

sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir, "lib")))

import galaxy.model.tool_shed_install.mapping as mapping


def main(opts, session, model):
    """
    Find all tool shed repositories with the bad path and update with the correct path.
    """
    for row in session.query(model.ToolShedRepository).all():
        if "shed_config_filename" in row.metadata_:
            if row.metadata_["shed_config_filename"] == opts.bad_filename:
                row.metadata_["shed_config_filename"] = opts.good_filename
                session.add(row)
                session.commit()
    return 0


def create_database(config_file):
    parser = ConfigParser()
    parser.read(config_file)
    # Determine which database connection to use.
    database_connection = parser.get("app:main", "install_database_connection")
    if database_connection is None:
        database_connection = parser.get("app:main", "database_connection")
    if database_connection is None:
        database_connection = "sqlite:///{}".format(parser.get("app:main", "database_file"))
    if database_connection is None:
        print("Unable to determine correct database connection.")
        exit(1)

    # Initialize the database connection.
    engine = create_engine(database_connection)
    MetaData(bind=engine)
    install_session = scoped_session(sessionmaker(bind=engine, autoflush=False))
    model = mapping.init(database_connection)
    return install_session, model


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--config_file", dest="config_file", required=True, help="The path to your Galaxy configuration .ini file."
    )
    parser.add_argument(
        "--from",
        dest="bad_filename",
        required=True,
        help="The old, invalid path to the shed_tool_conf.xml or migrated_tools_conf.xml file.",
    )
    parser.add_argument(
        "--to",
        dest="good_filename",
        required=True,
        help="The updated path to the shed_tool_conf.xml or migrated_tools_conf.xml file.",
    )
    parser.add_argument(
        "--force",
        dest="force",
        action="store_true",
        help="Use this flag to set the new path even if the file does not (yet) exist there.",
    )
    opts = parser.parse_args()
    if not os.path.exists(opts.good_filename) and not opts.force:
        print(f"The file {opts.good_filename} does not exist, use the --force option to proceed.")
        exit(1)
    session, model = create_database(opts.config_file)
    exit(main(opts, session, model))
