"""
Modèles de données pour les adresses IP et leur historique
Basé sur modele-donnees.md
"""
from sqlalchemy import Column, String, Boolean, DateTime, Integer, ForeignKey, Index, JSON
from sqlalchemy.orm import relationship
from datetime import datetime
from backend.app.core.database import Base


class IP(Base):
    """
    Table principale des adresses IP
    Stocke les informations actuelles et les métadonnées de chaque IP
    """
    __tablename__ = "ip"

    # Clé primaire
    ip = Column(String, primary_key=True, index=True)

    # Métadonnées
    name = Column(String, nullable=True)  # Nom donné à l'IP
    known = Column(Boolean, default=False, index=True)  # IP connue ou inconnue
    tracked = Column(Boolean, default=False, index=True)  # IP suivie pour monitoring
    vm = Column(Boolean, default=False, index=True)  # Machine virtuelle
    network_device = Column(Boolean, default=False, index=True)  # Équipement réseau (switch, routeur, borne WiFi)
    hardware_bench = Column(Boolean, default=False, index=True)  # Lien hardware bench disponible
    location = Column(String, nullable=True)  # Localisation (ex: "Bureau", "Serveur")
    host = Column(String, nullable=True)  # Type d'hôte (ex: "PC", "Imprimante")
    ip_parent = Column(String, nullable=True)  # IP parent liée (relation logique)
    ip_enfant = Column(JSON, default=list)  # Liste d'IPs enfants (JSON)

    # Timestamps
    first_seen = Column(DateTime, default=datetime.now)  # Première détection
    last_seen = Column(DateTime, default=datetime.now, onupdate=datetime.now)  # Dernière vue

    # État réseau
    last_status = Column(String, index=True)  # "online", "offline", "unknown"

    # Informations réseau
    mac = Column(String, nullable=True)  # Adresse MAC
    vendor = Column(String, nullable=True)  # Fabricant (lookup MAC)
    hostname = Column(String, nullable=True)  # Nom d'hôte réseau
    link = Column(String, nullable=True)  # Lien personnalisé (URL)
    mac_changed = Column(Boolean, default=False)  # MAC address différente de celle attendue
    icon_filename = Column(String, nullable=True)  # Icône associée (fichier dans /data/icons)
    icon_url = Column(String, nullable=True)  # Lien associé à l'icône

    # Ports ouverts (stocké en JSON)
    open_ports = Column(JSON, default=list)  # Liste des ports ouverts

    # Synchronisation DHCP OPNsense
    dhcp_synced = Column(Boolean, default=False)  # Réservation DHCP créée dans Kea

    # Relation avec l'historique
    history = relationship("IPHistory", back_populates="ip_ref", cascade="all, delete-orphan")

    def __repr__(self):
        return f"<IP {self.ip} - {self.last_status} - {self.name or 'unnamed'}>"


class IPHistory(Base):
    """
    Table d'historique des états d'IP
    Stocke l'évolution dans le temps (24h par défaut)
    """
    __tablename__ = "ip_history"

    # Clé primaire auto-incrémentée
    id = Column(Integer, primary_key=True, autoincrement=True)

    # Foreign key vers la table IP
    ip = Column(String, ForeignKey("ip.ip", ondelete="CASCADE"), nullable=False, index=True)

    # Timestamp de l'enregistrement
    timestamp = Column(DateTime, default=datetime.now, index=True, nullable=False)

    # État à ce moment
    status = Column(String, nullable=False)  # "online", "offline"

    # Ports ouverts à ce moment (JSON)
    open_ports = Column(JSON, default=list)

    # Relation inverse vers IP
    ip_ref = relationship("IP", back_populates="history")

    def __repr__(self):
        return f"<IPHistory {self.ip} - {self.timestamp} - {self.status}>"


# Index recommandés (déjà définis dans les colonnes avec index=True)
# Index supplémentaires si nécessaire
Index('idx_ip_last_status', IP.last_status)
Index('idx_ip_history_timestamp', IPHistory.timestamp)
Index('idx_ip_history_ip', IPHistory.ip)
