"""
Usage Log Model - Track service usage for billing
"""
from sqlalchemy import Column, String, Integer, ForeignKey, Numeric, JSON, DateTime
from sqlalchemy.orm import relationship
from datetime import datetime

from app.models.base import BaseModel


class UsageLog(BaseModel):
    """
    Usage log model for tracking service consumption
    Used for usage-based billing
    """
    __tablename__ = "usage_logs"

    # Client & Subscription
    client_id = Column(Integer, ForeignKey("clients.id", ondelete="CASCADE"), nullable=False, index=True)
    subscription_id = Column(Integer, ForeignKey("subscriptions.id", ondelete="SET NULL"), nullable=True)

    # Service
    service_type = Column(String(50), nullable=False, index=True)
    # chatbot, voice_agent, document_intelligence, analytics, vision

    # Resource Type
    resource_type = Column(String(100), nullable=False, index=True)
    # Examples:
    # - chatbot: message, conversation, training_document
    # - voice_agent: call_minute, transcription
    # - document: document_processed, page_ocr
    # - analytics: report_generated, forecast_run
    # - vision: image_processed, face_detection

    # Usage Details
    quantity = Column(Integer, default=1, nullable=False)
    unit = Column(String(50), nullable=True)  # messages, minutes, documents, images, etc.

    # Cost (for usage-based billing)
    unit_cost = Column(Numeric(10, 4), default=0)
    total_cost = Column(Numeric(10, 2), default=0)
    currency = Column(String(3), default="INR")

    # Metadata
    extra_data = Column("metadata", JSON, default={})  # Renamed to avoid SQLAlchemy reserved word
    # Example: {
    #   "chatbot_id": 123,
    #   "conversation_id": "conv_456",
    #   "tokens_used": 1500,
    #   "model": "claude-3-5-sonnet"
    # }

    # Request Info
    request_id = Column(String(100), nullable=True)
    api_key_id = Column(Integer, ForeignKey("api_keys.id", ondelete="SET NULL"), nullable=True)
    ip_address = Column(String(50), nullable=True)

    # Timestamp (for precise billing)
    recorded_at = Column(DateTime(timezone=True), default=datetime.utcnow, nullable=False, index=True)

    # Billing
    is_billed = Column(Integer, default=0)  # 0 = not billed, 1 = included in invoice
    invoice_id = Column(Integer, ForeignKey("invoices.id", ondelete="SET NULL"), nullable=True)

    # Relationships
    client = relationship("Client", back_populates="usage_logs")

    def __repr__(self):
        return f"<UsageLog {self.service_type}:{self.resource_type} x{self.quantity}>"

    @staticmethod
    def aggregate_usage(logs: list, group_by: str = "resource_type") -> dict:
        """Aggregate usage logs by a field"""
        result = {}
        for log in logs:
            key = getattr(log, group_by)
            if key not in result:
                result[key] = {"quantity": 0, "cost": 0}
            result[key]["quantity"] += log.quantity
            result[key]["cost"] += float(log.total_cost or 0)
        return result
