from sqlalchemy import Column, String, DateTime, ForeignKey, Text, Enum as SqlEnum
from sqlalchemy.orm import relationship
from datetime import datetime
import uuid
from utils.utils import Base
from .schema import ReportType, ReportStatus


class Report(Base):
    __tablename__ = "reports"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    reporter_id = Column(String(36), ForeignKey("users.id", ondelete="RESTRICT"), nullable=False, index=True)
    reported_user_id = Column(String(36), ForeignKey("users.id", ondelete="SET NULL"), nullable=True, index=True)
    reported_listing_id = Column(String(36), ForeignKey("listings.id", ondelete="SET NULL"), nullable=True, index=True)
    report_type = Column(SqlEnum(ReportType, name="report_type_enum"), nullable=False)
    description = Column(Text, nullable=False)
    status = Column(SqlEnum(ReportStatus, name="report_status_enum"), nullable=False)
    reviewed_by_id = Column(String(36), ForeignKey("users.id", ondelete="SET NULL"), nullable=True, index=True)
    resolution_notes = Column(Text, nullable=True)
    resolved_at = Column(DateTime, nullable=True)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    reporter = relationship("User", foreign_keys=[reporter_id], back_populates="reports_created")
    reported_user = relationship("User", foreign_keys=[reported_user_id], back_populates="reports_received")
    reported_listing = relationship("Listing", back_populates="reports")
    reviewed_by = relationship("User", foreign_keys=[reviewed_by_id], back_populates="reports_reviewed")