from __future__ import annotations

import logging
from typing import TYPE_CHECKING

from blueprints.RoadmapAPI import RoadmapParameters
from logic import Constants

if TYPE_CHECKING:
    from logic.Database import Database

LOGGER = logging.getLogger(Constants.APP_NAME)


class DatabaseMigrator:
    def __init__(self, database: Database):
        self._database = database

    def migrate(self):
        latestVersion = self._database.VERSION
        currentVersion = self._database.get_version()

        while currentVersion < latestVersion:
            currentVersion = self._database.get_version()
            self.__migrate_version(currentVersion)

        if latestVersion == currentVersion:
            LOGGER.debug(f'Database version: {latestVersion} (latest)')
            return

    def __migrate_version(self, currentVersion):
        from logic.Database import FetchType

        if currentVersion == 1:
            LOGGER.debug('Migrating database from version 1 to 2...')

            queryColumnExists = f'SELECT EXISTS (SELECT 1 FROM information_schema.columns ' \
                                f'WHERE table_name=\'roadmaps\' AND column_name=\'{RoadmapParameters.HIDDEN.value}\');'
            exists = self._database._query(queryColumnExists, fetch_type=FetchType.ONE)

            if not exists['exists']:
                query = f'ALTER TABLE "roadmaps" ADD "{RoadmapParameters.HIDDEN.value}" boolean NOT NULL DEFAULT false;'
                self._database._query(query, fetch_type=FetchType.NONE)

            self._database.update_version(2)
            return

        raise ValueError(f'No migration handler for version {currentVersion} defined')