"""
Audit Log Model - Track all important actions
"""
from sqlalchemy import Column, String, Integer, ForeignKey, Text, JSON, DateTime
from sqlalchemy.orm import relationship
from datetime import datetime

from app.models.base import BaseModel


class AuditLog(BaseModel):
    """
    Audit log model for tracking all important actions
    Used for security and compliance
    """
    __tablename__ = "audit_logs"

    # Who
    user_id = Column(Integer, ForeignKey("users.id", ondelete="SET NULL"), nullable=True, index=True)
    client_id = Column(Integer, ForeignKey("clients.id", ondelete="SET NULL"), nullable=True, index=True)
    user_email = Column(String(255), nullable=True)  # Store email in case user is deleted

    # What
    action = Column(String(100), nullable=False, index=True)
    # Examples: user.login, user.logout, client.create, subscription.upgrade,
    #           invoice.paid, api_key.create, settings.update

    resource_type = Column(String(100), nullable=True)
    # Examples: user, client, subscription, invoice, api_key, chatbot, document

    resource_id = Column(String(100), nullable=True)
    # ID of the affected resource

    # Details
    description = Column(Text, nullable=True)
    old_values = Column(JSON, nullable=True)  # Previous state
    new_values = Column(JSON, nullable=True)  # New state
    extra_data = Column("metadata", JSON, default={})  # Renamed to avoid SQLAlchemy reserved word

    # Request Info
    ip_address = Column(String(50), nullable=True)
    user_agent = Column(String(500), nullable=True)
    request_id = Column(String(100), nullable=True)

    # Status
    status = Column(String(50), default="success")  # success, failed, pending

    # Timestamp
    performed_at = Column(DateTime(timezone=True), default=datetime.utcnow, nullable=False, index=True)

    # Relationships
    user = relationship("User", back_populates="audit_logs")

    def __repr__(self):
        return f"<AuditLog {self.action} by {self.user_email}>"

    @staticmethod
    def create_log(
        action: str,
        user_id: int = None,
        client_id: int = None,
        user_email: str = None,
        resource_type: str = None,
        resource_id: str = None,
        description: str = None,
        old_values: dict = None,
        new_values: dict = None,
        ip_address: str = None,
        user_agent: str = None,
        request_id: str = None,
        status: str = "success"
    ) -> "AuditLog":
        """Factory method to create audit log"""
        return AuditLog(
            action=action,
            user_id=user_id,
            client_id=client_id,
            user_email=user_email,
            resource_type=resource_type,
            resource_id=str(resource_id) if resource_id else None,
            description=description,
            old_values=old_values,
            new_values=new_values,
            ip_address=ip_address,
            user_agent=user_agent,
            request_id=request_id,
            status=status
        )
