from config.reuseable import fields, models, datetime class User(models.Model): id = fields.IntField(pk=True) email = fields.CharField(max_length=255, unique=True) username = fields.CharField(max_length=255, unique=True) password = fields.CharField(max_length=255, unique=True) current_streak = fields.IntField(default=0) longest_streak = fields.IntField(default=0) created_at = fields.DatetimeField(auto_now_add=True) challenges: fields.ReverseRelation["Challenge"] progresses: fields.ReverseRelation["Progress"] coach_sessions: fields.ReverseRelation["CoachSession"] milestones: fields.ReverseRelation["Milestone"] class Challenge(models.Model): id = fields.IntField(pk=True) user = fields.ForeignKeyField("models.User", related_name="challenges") title = fields.CharField(max_length=100) description = fields.TextField(null=True) start_date = fields.DateField() end_date = fields.DateField() is_active = fields.BooleanField(default=True) is_completed = fields.BooleanField(default=False) created_at = fields.DatetimeField(auto_now_add=True) progresses: fields.ReverseRelation["Progress"] class Progress(models.Model): id = fields.IntField(pk=True) user = fields.ForeignKeyField("models.User", related_name="progresses") challenge = fields.ForeignKeyField("models.Challenge", related_name="progresses") day = fields.IntField() note = fields.TextField(null=True) completed = fields.BooleanField(default=False) date = fields.DateField(default=datetime.utcnow) class Meta: unique_together = ("user", "challenge", "day") class Milestone(models.Model): id = fields.IntField(pk=True) user = fields.ForeignKeyField("models.User", related_name="milestones") challenge = fields.ForeignKeyField( "models.Challenge", related_name="milestones", null=True ) title = fields.CharField(max_length=100) description = fields.TextField(null=True) achieved = fields.BooleanField(default=False) date_achieved = fields.DatetimeField(null=True) class CoachSession(models.Model): id = fields.IntField(pk=True) user = fields.ForeignKeyField("models.User", related_name="coach_sessions") challenge = fields.ForeignKeyField( "models.Challenge", related_name="coach_sessions", null=True ) message_from_user = fields.TextField() response_from_ai = fields.TextField() timestamp = fields.DatetimeField(auto_now_add=True)