from __future__ import annotations

from datetime import datetime, timezone

from sqlalchemy import Column, Integer, String, DateTime, Boolean
from sqlalchemy.orm import declarative_base

Base = declarative_base()


class License(Base):
    """
    Model mapped to the 'users' table from the main Web Sentinel application.
    This represents user accounts with their associated licenses/API keys.
    """
    __tablename__ = "users"

    id = Column(Integer, primary_key=True)
    key_hash = Column(String(64))
    name = Column(String(100), nullable=False)
    email = Column(String(120), nullable=False, unique=True)
    tier = Column(String(20))
    created_at = Column(DateTime)
    last_used = Column(DateTime)
    is_active = Column(Boolean)
    daily_limit = Column(Integer)
    monthly_limit = Column(Integer)
    password_hash = Column(String(255))
    api_key = Column(String(100), unique=True)
    license_key = Column(String(100))
    license_purchased_at = Column(DateTime)
    license_expires_at = Column(DateTime)
    last_login = Column(DateTime)
    name_full = Column(String(255))
    
    # New columns added by migration for admin panel
    max_domains = Column(Integer, default=1)
    max_users = Column(Integer, default=1)
    allow_source_scan = Column(Boolean, default=False)
    max_source_files = Column(Integer, default=0)
    max_source_size_mb = Column(Integer, default=0)
    advanced_rules = Column(Boolean, default=False)
    stripe_customer_id = Column(String(255))
    stripe_subscription_id = Column(String(255))
    updated_at = Column(DateTime)
    events = Column(String)  # JSON stored as text
    
    # Computed properties for compatibility with admin panel
    @property
    def status(self):
        """Return 'active' if is_active is True, else 'suspended'"""
        return "active" if self.is_active else "suspended"
    
    @status.setter
    def status(self, value):
        """Set is_active based on status string"""
        self.is_active = (value.lower() == "active")
    
    @property
    def expires_at(self):
        """Alias for license_expires_at for compatibility"""
        return self.license_expires_at
    
    @expires_at.setter
    def expires_at(self, value):
        """Set license_expires_at"""
        self.license_expires_at = value
    
    @property
    def usage_count(self):
        """Placeholder for compatibility - could be computed from scans table"""
        return 0
    
    @property
    def last_used_at(self):
        """Alias for last_used for compatibility"""
        return self.last_used
