import uuid

from src.core.database import Base
from sqlalchemy.orm import relationship
from sqlalchemy import (
    Column,
    DateTime,
    String,
    Integer,
    Date,
    ForeignKey,
    UniqueConstraint,
    Index,
)


class Computer(Base):
    __tablename__ = "computadores"

    id = Column(
        String(36),
        primary_key=True,
        default=lambda: str(uuid.uuid4()),
    )

    nome_host = Column(String(150), nullable=True, name="nomeHost")
    nome_usuario = Column(String(150), nullable=True, name="nomeUsuario")
    numero_serie = Column(
        String(255),
        nullable=True,
        unique=True,
        name="numeroSerie",
    )
    modelo = Column(String(150), nullable=True)
    fabricante = Column(String(150), nullable=True)
    sistema_operacional = Column(
        String(150),
        nullable=True,
        name="sistemaOperacional",
    )
    ram_instalada = Column(Integer, nullable=True, name="ramInstalada")
    placa_video = Column(String(150), nullable=True, name="placaVideo")
    discos = Column(String(255), nullable=True)
    dominio = Column(String(150), nullable=True)
    localizacao = Column(String(150), nullable=True, name="localizacao")
    data_primeiro_registro = Column(
        Date, nullable=True, name="dataPrimeiroRegistro")
    empresa_id = Column(
        String(36),
        ForeignKey(
            "empresas.id",
            name="fk_computadores_empresas",
        ),
        nullable=True,
        index=True,
    )
    usuario_id = Column(
        Integer,
        ForeignKey(
            "usuarios.id",
            name="fk_computadores_usuarios",
        ),
        nullable=True,
        index=True,
    )

    atividades = relationship(
        "Activity",
        back_populates="computador",
        lazy="select")
    empresa = relationship(
        "Empresa",
        back_populates="computadores",
        lazy="select")
    usuario = relationship("Usuario", lazy="select")

    __table_args__ = (
        UniqueConstraint(
            "nomeHost",
            "empresa_id",
            name="uq_computadores_nomehost_empresa",
        ),
        UniqueConstraint(
            "nomeUsuario",
            "empresa_id",
            name="uq_computadores_nomeusuario_empresa",
        ),
        Index("numeroSerie", "numeroSerie", unique=True),
        Index("idx_computadores_usuario_id", "usuario_id"),
        Index("idx_computadores_empresa_id", "empresa_id"),
        Index(
            "idx_computadores_usuario_empresa",
            "usuario_id",
            "empresa_id",
        ),
    )


class ComputerOnline(Base):
    __tablename__ = "computadoresOnline"

    computador_id = Column(
        String(50),
        ForeignKey(
            "computadores.id",
            name="fk_computadores_online_computadores",
        ),
        primary_key=True,
        nullable=False,
    )
    usuario = Column(String(255), nullable=True)
    ultimo_visto = Column(DateTime, nullable=True, name="ultimoVisto")
    online = Column(Integer, nullable=False, default=1)
