import sqlite3
import os
import logging

log = logging.getLogger(__name__)


def do_migration(conf):
    log.info("Doing the migration")
    add_lbry_file_metadata(conf.data_dir)
    log.info("Migration succeeded")


def add_lbry_file_metadata(db_dir):
    """
    We migrate the blobs.db used in BlobManager to have a "should_announce" column,
    and set this to True for blobs that are sd_hash's or head blobs (first blob in stream)
    """

    name_metadata = os.path.join(db_dir, "blockchainname.db")
    lbryfile_info_db = os.path.join(db_dir, 'lbryfile_info.db')

    if not os.path.isfile(name_metadata) and not os.path.isfile(lbryfile_info_db):
        return

    if not os.path.isfile(lbryfile_info_db):
        log.info("blockchainname.db was not found but lbryfile_info.db was found, skipping migration")
        return

    name_metadata_db = sqlite3.connect(name_metadata)
    lbryfile_db = sqlite3.connect(lbryfile_info_db)
    name_metadata_cursor = name_metadata_db.cursor()
    lbryfile_cursor = lbryfile_db.cursor()

    lbryfile_db.executescript(
        "create table if not exists lbry_file_metadata (" +
        "    lbry_file integer primary key, " +
        "    txid text, " +
        "    n integer, " +
        "    foreign key(lbry_file) references lbry_files(rowid)"
        ")")

    _files = lbryfile_cursor.execute("select rowid, stream_hash from lbry_files").fetchall()

    lbry_files = {x[1]: x[0] for x in _files}
    for (sd_hash, stream_hash) in lbryfile_cursor.execute("select * "
                                                          "from lbry_file_descriptors").fetchall():
        lbry_file_id = lbry_files[stream_hash]
        outpoint = name_metadata_cursor.execute("select txid, n from name_metadata "
                                                "where sd_hash=?",
                                                (sd_hash,)).fetchall()
        if outpoint:
            txid, nout = outpoint[0]
            lbryfile_cursor.execute("insert into lbry_file_metadata values (?, ?, ?)",
                                    (lbry_file_id, txid, nout))
        else:
            lbryfile_cursor.execute("insert into lbry_file_metadata values (?, ?, ?)",
                                    (lbry_file_id, None, None))
    lbryfile_db.commit()

    lbryfile_db.close()
    name_metadata_db.close()
