import logging
import datetime

from app.classes.shared.helpers import helper

try:
    from peewee import (
        SqliteDatabase,
        Model,
        CharField,
        DoesNotExist,
        AutoField,
        DateTimeField,
    )
    from playhouse.shortcuts import model_to_dict

except ModuleNotFoundError as e:
    helper.auto_installer_fix(e)

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}
)

# **********************************************************************************
#                                   Roles Class
# **********************************************************************************
class Roles(Model):
    role_id = AutoField()
    created = DateTimeField(default=datetime.datetime.now)
    last_update = DateTimeField(default=datetime.datetime.now)
    role_name = CharField(default="", unique=True, index=True)

    class Meta:
        table_name = "roles"
        database = database


# **********************************************************************************
#                                   Roles Helpers
# **********************************************************************************
class helper_roles:
    @staticmethod
    def get_all_roles():
        query = Roles.select()
        return query

    @staticmethod
    def get_roleid_by_name(role_name):
        try:
            return (Roles.get(Roles.role_name == role_name)).role_id
        except DoesNotExist:
            return None

    @staticmethod
    def get_role(role_id):
        return model_to_dict(Roles.get(Roles.role_id == role_id))

    @staticmethod
    def add_role(role_name):
        role_id = Roles.insert(
            {
                Roles.role_name: role_name.lower(),
                Roles.created: helper.get_time_as_string(),
            }
        ).execute()
        return role_id

    @staticmethod
    def update_role(role_id, up_data):
        return Roles.update(up_data).where(Roles.role_id == role_id).execute()

    @staticmethod
    def remove_role(role_id):
        with database.atomic():
            role = Roles.get(Roles.role_id == role_id)
            return role.delete_instance()

    @staticmethod
    def role_id_exists(role_id):
        if not roles_helper.get_role(role_id):
            return False
        return True


roles_helper = helper_roles()
