"""
Admin NotebookLM Account Model.
Stores multiple NotebookLM admin accounts that can be used by users.
"""
from datetime import datetime
from app.extensions import db


class NLMAdminAccount(db.Model):
    """NotebookLM admin account for shared usage among users."""
    __tablename__ = "nlm_admin_accounts"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255), nullable=False)  # Display name for admin
    google_email = db.Column(db.String(255), nullable=False, unique=True)  # Google account email
    session_path = db.Column(db.String(500), nullable=True)  # Path to storage_state.json

    # Usage tracking
    total_notebooks = db.Column(db.Integer, default=0)  # Total notebooks created with this account
    last_used_at = db.Column(db.DateTime, nullable=True)

    # Account status
    is_active = db.Column(db.Boolean, default=True)
    is_healthy = db.Column(db.Boolean, default=True)  # If session is still valid
    last_health_check = db.Column(db.DateTime, nullable=True)
    error_message = db.Column(db.Text, nullable=True)  # Last error if not healthy

    # Priority for selection (lower = higher priority)
    priority = db.Column(db.Integer, default=100)

    # Metadata
    created_by_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)

    # Relationships
    created_by = db.relationship("User", foreign_keys=[created_by_id], lazy="select")
    notebooks = db.relationship("ReportNotebook", backref="nlm_account", lazy="dynamic")

    @property
    def usage_percentage(self):
        """Calculate usage percentage (250 max per NotebookLM account)."""
        return min(100, int((self.total_notebooks / 250) * 100))

    @property
    def is_available(self):
        """Check if account is available for use."""
        if not self.is_active or not self.is_healthy:
            return False
        if self.total_notebooks >= 250:
            return False
        return True

    def to_dict(self):
        """Convert to dictionary for API responses."""
        return {
            "id": self.id,
            "name": self.name,
            "google_email": self.google_email,
            "total_notebooks": self.total_notebooks,
            "usage_percentage": self.usage_percentage,
            "last_used_at": self.last_used_at.isoformat() if self.last_used_at else None,
            "is_active": self.is_active,
            "is_healthy": self.is_healthy,
            "is_available": self.is_available,
            "priority": self.priority,
            "error_message": self.error_message,
        }
