from dostadmin import db
from flask_sqlalchemy.query import Query as BaseQuery


class SystemConfigQuery(BaseQuery):
    def get_config_value(self, config_name):
        """
        This method is used to get a config value in the system_config table.
        """
        existing_records = self.filter(SystemConfiguration.name == config_name.upper())

        output = None
        if existing_records and existing_records.count():
            output = existing_records.first()

        return output

    def get_config_by_id(self, config_id):
        existing_records = self.filter(SystemConfiguration.id == int(config_id))

        output = None
        if existing_records and existing_records.count():
            output = existing_records.first()

        return output

    def get_all_configs(self):
        return self.filter()


class SystemConfiguration(db.Model):
    __tablename__ = "system_configuration"
    query_class = SystemConfigQuery

    id = db.Column("id", db.Integer, primary_key=True)
    name = db.Column(db.String(50), unique=True, index=True, nullable=False)
    value = db.Column(db.String(256))

    def set_config(self, config_name, config_value):
        existing_record = self.get_config(config_name=config_name)

        if existing_record:
            # Delete the existing record and create a new one.
            db.session.delete(existing_record)
            db.session.commit()

        # Creating a new record
        system_config_record = SystemConfiguration(
            name=config_name.upper(), value=config_value
        )
        try:
            db.session.add(system_config_record)
            db.session.commit()
            return system_config_record
        except Exception:
            return None

    def delete_config(self, config_id):
        record = self.get_config_by_id(config_id)
        if record:
            try:
                db.session.delete(record)
                db.session.commit()
                return True
            except Exception:
                return False
        return False

    def get_config(self, config_name):
        return SystemConfiguration.query.get_config_value(
            config_name=config_name.upper()
        )

    def get_config_by_id(self, config_id):
        return SystemConfiguration.query.get_config_by_id(config_id=int(config_id))

    def as_dict(self):
        return {c.name: getattr(self, c.name) for c in self.__table__.columns}

    def __repr__(self):
        return f"<SystemConfiguration {self.name}>"
