import enum
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, JSON, Date, Text, Enum
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from sqlalchemy.dialects.postgresql import UUID as PG_UUID
from app.db.base_class import Base

class LogSeverity(str, enum.Enum):
    info = "info"           # Általános művelet (pl. profil megtekintés)
    warning = "warning"     # Gyanús, de nem biztosan káros (pl. 3 elrontott jelszó)
    critical = "critical"   # Súlyos művelet (pl. jelszóváltoztatás, export)
    emergency = "emergency" # Azonnali beavatkozást igényel (pl. SuperAdmin módosítás)

class VehicleOwnership(Base):
    __tablename__ = "vehicle_ownerships"
    __table_args__ = {"schema": "data"}
    id = Column(Integer, primary_key=True, index=True)
    vehicle_id = Column(PG_UUID(as_uuid=True), ForeignKey("data.assets.id"), nullable=False)
    user_id = Column(Integer, ForeignKey("data.users.id"), nullable=False)
    start_date = Column(Date, nullable=False, default=func.current_date())
    end_date = Column(Date, nullable=True)
    notes = Column(Text, nullable=True)

    vehicle = relationship("Asset", back_populates="ownership_history")
    user = relationship("User", back_populates="ownership_history")

class AuditLog(Base):
    __tablename__ = "audit_logs"
    __table_args__ = {"schema": "data"}
    
    id = Column(Integer, primary_key=True, index=True)
    user_id = Column(Integer, ForeignKey("data.users.id"), nullable=True)
    severity = Column(Enum(LogSeverity), default=LogSeverity.info, nullable=False)
    
    # Mi történt és min?
    action = Column(String(100), nullable=False, index=True) 
    target_type = Column(String(50), index=True) # pl. "User", "Wallet", "Asset"
    target_id = Column(String(50), index=True)   # A cél rekord ID-ja
    
    # Részletes adatok (JSONB formátum a rugalmasságért)
    # A 'changes' helyett explicit old/new párost használunk a könnyebb visszaállításhoz
    old_data = Column(JSON, nullable=True)
    new_data = Column(JSON, nullable=True)
    
    # Biztonsági nyomkövetés
    ip_address = Column(String(45), index=True) # IPv6-ot is támogat
    user_agent = Column(Text, nullable=True)     # Böngésző/Eszköz információ
    
    timestamp = Column(DateTime(timezone=True), server_default=func.now(), index=True)
    
    user = relationship("User")