"""Define the camera dataset table for the pipeline"""

from sqlalchemy import Column, Integer, String, ForeignKey

from sqlalchemy.orm import relationship

from autowisp.database.data_model.base import DataModelBase

__all__ = ["Camera"]


# The standard use of SQLAlchemy ORM requires classes with no public methods.
# pylint: disable=too-few-public-methods
class Camera(DataModelBase):
    """The table describing the camera specified"""

    __tablename__ = "camera"

    camera_type_id = Column(
        Integer,
        ForeignKey("camera_type.id", onupdate="CASCADE", ondelete="RESTRICT"),
        nullable=False,
        doc="The id of the camera type",
    )
    serial_number = Column(
        String(100),
        nullable=False,
        unique=True,
        index=True,
        doc="The serial number of the camera",
    )
    notes = Column(
        String(1000), nullable=False, doc="The notes provided for the camera"
    )

    observing_sessions = relationship(
        "ObservingSession", back_populates="camera"
    )
    camera_type = relationship("CameraType", back_populates="cameras")
    observers = relationship(
        "Observer", secondary="camera_access", back_populates="cameras"
    )
    channels = relationship(
        "CameraChannel", secondary="camera_type", viewonly=True
    )

    def __str__(self):
        """Human readable info for the camera."""

        return f"Camera (S/N {self.serial_number}): " + (
            "no type"
            if self.camera_type is None
            else f"{self.camera_type.make} {self.camera_type.model} "
        )

    def to_dict(self):
        """Return dict representation of the camera."""

        return {"serial no": self.serial_number, "notes": self.notes}


# pylint: enable=too-few-public-methods
