from nonebot.log import logger
from nonebot_plugin_datastore.db import get_engine, post_db_init, pre_db_init
from sqlalchemy import inspect, text

from .config.config_legacy import start_up as legacy_db_startup
from .config.db_migration import data_migrate
from .scheduler.manager import init_scheduler


@pre_db_init
async def pre():
    def _has_table(conn, table_name):
        insp = inspect(conn)
        return insp.has_table(table_name)

    async with get_engine().begin() as conn:
        if not await conn.run_sync(_has_table, "alembic_version"):
            logger.debug("未发现默认版本数据库，开始初始化")
            return

        logger.debug("发现默认版本数据库，开始检查版本")
        t = await conn.scalar(text("select version_num from alembic_version"))
        if t not in [
            "4a46ba54a3f3",  # alter_type
            "5f3370328e44",  # add_time_weight_table
            "0571870f5222",  # init_db
            "a333d6224193",  # add_last_scheduled_time
            "c97c445e2bdb",  # add_constraint
        ]:
            logger.warning(f"当前数据库版本：{t}，不是插件的版本，已跳过。")
            return

        logger.debug(f"当前数据库版本：{t}，是插件的版本，开始迁移。")
        # 删除可能存在的版本数据库
        if await conn.run_sync(_has_table, "nonebot_bison_alembic_version"):
            await conn.execute(text("drop table nonebot_bison_alembic_version"))

        await conn.execute(
            text("alter table alembic_version rename to nonebot_bison_alembic_version")
        )


@post_db_init
async def post():
    # legacy db
    legacy_db_startup()
    # migrate data
    await data_migrate()
    # init scheduler
    await init_scheduler()
    logger.info("nonebot-bison bootstrap done")
