import operator
from sqlalchemy import CheckConstraint, Column, DateTime, Float, ForeignKey, Integer, String ,Boolean
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.types import ARRAY
from sqlalchemy.orm import relationship
from typing import Dict
from ._Base import _Base

class OpticalLinkModel(_Base):
    __tablename__ = 'opticallink'

    optical_link_uuid           = Column(UUID(as_uuid=False), primary_key=True)
    optical_link_name           = Column(String, nullable=False)
    length = Column(Integer, nullable=True)
    source  = Column(String, nullable=True)
    target  = Column(String, nullable=True)
    optical_link_fiber= relationship("FiberModel") 
    created_at          = Column(DateTime, nullable=False)
    updated_at          = Column(DateTime, nullable=False)

 
   

    def dump_id(self) -> Dict:
        return {'optical_link_uuid': {'uuid': self.link_uuid}}

    def dump(self) -> Dict:
        result = {
            'optical_link_id'   : self.dump_id(),
            'name'              : self.optical_link_name,
            'details': {
                "length"        : self.length,
                'source'        : self.source,
                "target"        : self.target,
                'fibers'        : [ fiber.dump() for fiber in self.optical_link_fiber ]
            }
          
        }
       
        return result

class FiberModel(_Base):
    __tablename__ = 'fiber'
    fiber_uuid  = Column(UUID(as_uuid=False), primary_key=True)
    fiber_length = Column(Integer, nullable=True)
    source_port  = Column(String, nullable=True)
    destination_port  = Column(String, nullable=True)
    local_peer_port = Column(String, nullable=True)
    remote_peer_port = Column(String, nullable=True)
    used = Column(Boolean ,nullable=true)
    c_slots = Column (ARRAY(Integer),nullable=True)
    l_slots = Column (ARRAY(Integer),nullable=True)
    s_slots = Column (ARRAY(Integer),nullable=True)
    optical_link_uuid     = Column(ForeignKey('opticallink.optical_link_uuid',  ondelete='CASCADE' ), primary_key=True)
	optical_link     = relationship('OpticalLinkModel',     back_populates='optical_link_fibers')
 
 
 	def dump_id(self) -> Dict:
        return {'fiber_uuid': {'uuid': self.fiber_uuid}}
    
    
    def dump(self) -> Dict:
        result = {
        'ID'               : self.dump_id(),
        'length'           : self.fiber_length,
        "src_port"         : self.source_port,
        "dst_port"         : self.destination_port,
        "local_peer_port"  : self.local_peer_port,
        "remote_peer_port" : self.remote_peer_port,
        "used"             : self.used,
        "c_slots"          : self.c_slots ,
        "l_slots"          : self.l_slots,
        "s_slots"          : self.s_slots
          
        }
       
        return result