from django.db import models
from django.contrib.auth.models import User
import random, string
from django.utils import timezone
from datetime import timedelta


class UserOTPProfile(models.Model):
    METHOD_CHOICES = [
        ("email", "Email"),
        ("whatsapp", "WhatsApp"),
    ]

    user = models.OneToOneField(
        User, on_delete=models.CASCADE, related_name="otp_profile"
    )
    method = models.CharField(max_length=10, choices=METHOD_CHOICES, default="email")
    phone_number = models.CharField(max_length=20, blank=True)  # e.g. +2348012345678
    otp_code = models.CharField(max_length=6, blank=True)
    otp_expires_at = models.DateTimeField(null=True, blank=True)
    is_2fa_enabled = models.BooleanField(default=False)

    def generate_otp(self):
        self.otp_code = "".join(random.choices(string.digits, k=6))
        self.otp_expires_at = timezone.now() + timedelta(minutes=10)
        self.save()
        return self.otp_code

    # models.py
    def verify_otp(self, code):
        if self.otp_code == code and timezone.now() < self.otp_expires_at:
            self.otp_code = ""
            self.otp_expires_at = None
            self.save(
                update_fields=["otp_code", "otp_expires_at"]
            )  # only touch these two
            return True
        return False

    def __str__(self):
        return f"{self.user.username} — {self.method}"
