"""Email verification model for user registration."""
import uuid
from datetime import datetime, timedelta
from sqlalchemy.dialects.postgresql import UUID
from app import db


class EmailVerification(db.Model):
    """Email verification codes for user registration."""
    
    __tablename__ = 'email_verifications'
    
    id = db.Column(db.String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    email = db.Column(db.String(120), nullable=False, index=True)
    code = db.Column(db.String(6), nullable=False)
    attempts = db.Column(db.Integer, default=0)
    is_used = db.Column(db.Boolean, default=False)
    created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
    expires_at = db.Column(db.DateTime, nullable=False)
    
    def __init__(self, email, code, expiry_minutes=30):
        """Initialize verification code with expiration."""
        self.email = email
        self.code = code
        self.expires_at = datetime.utcnow() + timedelta(minutes=expiry_minutes)
    
    def is_expired(self):
        """Check if verification code has expired."""
        return datetime.utcnow() > self.expires_at
    
    def is_valid(self):
        """Check if code is valid (not expired, not used, attempts not exceeded)."""
        return not self.is_expired() and not self.is_used and self.attempts < 5
    
    def increment_attempts(self):
        """Increment failed verification attempts."""
        self.attempts += 1
    
    def mark_as_used(self):
        """Mark verification code as used."""
        self.is_used = True
    
    def __repr__(self):
        """String representation of EmailVerification."""
        return f'<EmailVerification {self.email}>'