"""Communication/network interface models."""

from shopdb.extensions import db
from .base import BaseModel


class CommunicationType(BaseModel):
    """Types of communication interfaces."""
    __tablename__ = 'communicationtypes'

    comtypeid = db.Column(db.Integer, primary_key=True)
    comtype = db.Column(db.String(50), unique=True, nullable=False)
    description = db.Column(db.Text)

    # Types: IP, Serial, USB, VNC, FTP, DNC, Parallel, Network Interface

    def __repr__(self):
        return f"<CommunicationType {self.comtype}>"


class Communication(BaseModel):
    """
    Communication interface for an asset (or legacy machine).
    Stores network config, serial settings, etc.
    """
    __tablename__ = 'communications'

    communicationid = db.Column(db.Integer, primary_key=True)

    # New asset-based FK (preferred)
    assetid = db.Column(
        db.Integer,
        db.ForeignKey('assets.assetid'),
        nullable=True,
        comment='FK to assets table (new architecture)'
    )

    comtypeid = db.Column(
        db.Integer,
        db.ForeignKey('communicationtypes.comtypeid'),
        nullable=False
    )

    # Network configuration (for IP type)
    ipaddress = db.Column(db.String(50))
    subnetmask = db.Column(db.String(50))
    gateway = db.Column(db.String(50))
    dns1 = db.Column(db.String(50))
    dns2 = db.Column(db.String(50))
    macaddress = db.Column(db.String(50))
    isdhcp = db.Column(db.Boolean, default=False)

    # Serial configuration (for Serial type)
    comport = db.Column(db.String(20))
    baudrate = db.Column(db.Integer)
    databits = db.Column(db.Integer)
    stopbits = db.Column(db.String(10))
    parity = db.Column(db.String(20))
    flowcontrol = db.Column(db.String(20))

    # VNC/FTP configuration
    port = db.Column(db.Integer)
    username = db.Column(db.String(100))
    # Note: passwords should not be stored here - use secure vault

    # DNC configuration
    pathname = db.Column(db.String(255))
    pathname2 = db.Column(db.String(255), comment='Secondary path for dualpath')

    # Flags
    isprimary = db.Column(
        db.Boolean,
        default=False,
        comment='Primary communication method'
    )
    ismachinenetwork = db.Column(
        db.Boolean,
        default=False,
        comment='On machine network vs office network'
    )

    notes = db.Column(db.Text)

    # Relationships
    comtype = db.relationship('CommunicationType', backref='communications')

    __table_args__ = (
        db.Index('idx_comm_asset', 'assetid'),
        db.Index('idx_comm_ip', 'ipaddress'),
    )

    def __repr__(self):
        return f"<Communication {self.assetid}:{self.comtype.comtype if self.comtype else 'Unknown'}>"
