from datetime import datetime, date
from extensions import db
import enum
from werkzeug.security import generate_password_hash, check_password_hash

# -------------------------
# Role Enum
# -------------------------
class RoleEnum(enum.Enum):
    ADMIN = "admin"
    USER = "user"

# -------------------------
# License Type Enum
# -------------------------
class LicenseTypeEnum(enum.Enum):
    TIME_BASED = "time_based"
    QUANTITY_BASED = "quantity_based"


# -------------------------
# User Model
# -------------------------
class User(db.Model):
    """Main user table."""
    __tablename__ = "users"

    id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.String(120), nullable=True)
    last_name = db.Column(db.String(120), nullable=True)
    email = db.Column(db.String(255), unique=True, nullable=True, index=True)
    phone = db.Column(db.String(50), unique=True, nullable=True, index=True)
    password_hash = db.Column(db.String(255), nullable=True)
    is_active = db.Column(db.Boolean, default=True, nullable=False)
    created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)

    # -------------------------
    # Role
    # -------------------------
    role = db.Column(db.Enum(RoleEnum, name="role_enum"), nullable=False, default=RoleEnum.USER)

    # -------------------------
    # License fields
    # -------------------------
    license_type = db.Column(db.Enum(LicenseTypeEnum, name="license_type_enum"), default=LicenseTypeEnum.QUANTITY_BASED)
    license_expiry = db.Column(db.Date, nullable=True)      # تاریخ انقضا برای لایسنس زمانی
    license_quantity = db.Column(db.Integer, nullable=True, default=10) # تعداد مجاز برای لایسنس تعدادی

    # -------------------------
    # Password helpers
    # -------------------------
    def set_password(self, password: str):
        """Set password hash for the user."""
        self.password_hash = generate_password_hash(password)

    def check_password(self, password: str) -> bool:
        """Verify password against stored hash."""
        if not self.password_hash:
            return False
        return check_password_hash(self.password_hash, password)

    # -------------------------
    # Role helpers
    # -------------------------
    def is_admin(self) -> bool:
        """Return True if user is admin role."""
        return self.role == RoleEnum.ADMIN

    # -------------------------
    # String representation
    # -------------------------
    def __repr__(self):
        return f"<User {self.id}: {self.first_name} {self.last_name}>"
