"""OSINT enrichment items — CVEs, blogs, PoCs, and advisories linked to techniques."""

# Import uuid
import uuid

# Import Boolean, Column, DateTime, ForeignKey, String, ... from sqlalchemy
from sqlalchemy import Boolean, Column, DateTime, ForeignKey, String, Text, func

# Import JSONB, UUID from sqlalchemy.dialects.postgresql
from sqlalchemy.dialects.postgresql import JSONB, UUID

# Import relationship from sqlalchemy.orm
from sqlalchemy.orm import relationship

# Import Base from app.database
from app.database import Base


# Define class OsintItem
class OsintItem(Base):
    """Represents an OSINT data point (CVE, blog, PoC, advisory) associated with a MITRE ATT&CK technique.

    Used by the enrichment pipeline to surface relevant threat intelligence
    for each technique, flagging those that need review.
    """

    # Assign __tablename__ = "osint_items"
    __tablename__ = "osint_items"

    # Assign id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    # Assign technique_id = Column(
    technique_id = Column(
        UUID(as_uuid=True),
        ForeignKey("techniques.id"),
        # Keyword argument: nullable
        nullable=False,
        # Keyword argument: index
        index=True,
    )
    # Assign source_type = Column(String(50), nullable=False)  # "cve", "blog", "poc", "advisory"
    source_type = Column(String(50), nullable=False)  # "cve", "blog", "poc", "advisory"
    # Assign source_url = Column(Text, nullable=False)
    source_url = Column(Text, nullable=False)
    # Assign title = Column(String(500), nullable=False)
    title = Column(String(500), nullable=False)
    # Assign description = Column(Text, nullable=True)
    description = Column(Text, nullable=True)
    # Assign severity = Column(String(20), nullable=True)  # CRITICAL, HIGH, MEDIUM, LOW, U...
    severity = Column(String(20), nullable=True)  # CRITICAL, HIGH, MEDIUM, LOW, UNKNOWN
    # Assign discovered_at = Column(DateTime(timezone=True), server_default=func.now(), nullable...
    discovered_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
    # Assign reviewed = Column(Boolean, default=False)
    reviewed = Column(Boolean, default=False)
    # Assign metadata_ = Column("metadata", JSONB, default={})
    metadata_ = Column("metadata", JSONB, default={})

    # ── Relationships ─────────────────────────────────────────────────
    technique = relationship("Technique", backref="osint_items")
