from peewee import *

db = DatabaseProxy()

class BaseModel(Model):
    class Meta:
        database = db

class ListModel(BaseModel):
    name = CharField(default="")
    chat_id = IntegerField()

    @property
    def content(self) -> dict:
        return {e.id: e.entry for e in self.entries}
    
    @content.setter
    def content(self, new_content: dict):
        old_content = self.content
        if len(old_content) < len(new_content):
            # we assume: only 1 item added (last item)
            new_item = list(new_content.values())[-1]
            ListEntryModel.create(list_model=self, entry = new_item)

        elif len(old_content) > len(new_content):
            to_delete_ids = set(old_content.keys()) - set(new_content.keys())
            ListEntryModel.delete().where(ListEntryModel.id.in_(list(to_delete_ids))).execute()

    @property
    def done_dict(self):
        return {e.id: e.done for e in self.entries}
    
    @done_dict.setter
    def done_dict(self, new_done: dict):
        old_done_dict = self.done_dict
        for k,d in new_done.items():
            if d != old_done_dict[k]:
                ListEntryModel.update(done = d).where(ListEntryModel.id == k).execute()




class ListEntryModel(BaseModel):
    list_model = ForeignKeyField(ListModel, backref="entries", on_delete="CASCADE")
    entry = TextField(default="")
    done = BooleanField(default=None, null=True)


def set_db(db_path):
    db.initialize(SqliteDatabase(db_path))
    with db:
        db.create_tables([ListModel, ListEntryModel], safe=True)