import logging

from app.classes.models.users import Users, users_helper
from app.classes.shared.helpers import helper
from app.classes.shared.console import console

# To disable warning about unused import ; Users is imported from here in other places
# pylint: disable=self-assigning-variable
Users = Users

try:
    # pylint: disable=unused-import
    from peewee import SqliteDatabase, fn
    from playhouse.shortcuts import model_to_dict

except ModuleNotFoundError as err:
    helper.auto_installer_fix(err)

logger = logging.getLogger(__name__)
peewee_logger = logging.getLogger("peewee")
peewee_logger.setLevel(logging.INFO)
database = SqliteDatabase(
    helper.db_path, pragmas={"journal_mode": "wal", "cache_size": -1024 * 10}
)


class db_builder:
    @staticmethod
    def default_settings():
        logger.info("Fresh Install Detected - Creating Default Settings")
        console.info("Fresh Install Detected - Creating Default Settings")
        default_data = helper.find_default_password()

        username = default_data.get("username", "admin")
        password = default_data.get("password", "crafty")

        users_helper.add_user(
            username=username,
            password=password,
            email="default@example.com",
            superuser=True,
        )

    @staticmethod
    def is_fresh_install():
        try:
            user = users_helper.get_by_id(1)
            if user:
                return False
        except:
            return True


class db_shortcuts:

    # **********************************************************************************
    #                                  Generic Databse Methods
    # **********************************************************************************
    @staticmethod
    def return_rows(query):
        rows = []

        try:
            if query.count() > 0:
                for s in query:
                    rows.append(model_to_dict(s))
        except Exception as e:
            logger.warning(f"Database Error: {e}")

        return rows

    @staticmethod
    def return_db_rows(model):
        data = [model_to_dict(row) for row in model]
        return data


# **********************************************************************************
#                                  Static Accessors
# **********************************************************************************
installer = db_builder()
db_helper = db_shortcuts()
