from datetime import datetime, timezone

from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, String, Text
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.orm import relationship

from src.core.models.base import Base

from src.utils.enums import WebCrawlerFileType
from sqlalchemy import Enum
from sqlalchemy import Enum as SAEnum
from collections import defaultdict
from sqlalchemy import UniqueConstraint

    
class WorkGroup(Base):
    __tablename__ = "work_groups"

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String(255), nullable=False)
    
    created_at = Column(DateTime, default=datetime.now(timezone.utc))
    updated_at = Column(DateTime, default=datetime.now(timezone.utc), onupdate=datetime.now(timezone.utc))
    deleted_at = Column(DateTime, nullable=True)
    work_group_web_crawlers = relationship("WorkGroupWebCrawler", back_populates="work_group", cascade="all, delete-orphan")
    

class WorkGroupWebCrawler(Base):
    __tablename__ = "work_group_web_crawlers"
    __table_args__ = (
        UniqueConstraint("work_group_id", "web_crawler_id", name="uq_work_group_web_crawler"),
    )

    id = Column(Integer, primary_key=True, index=True)
    work_group_id = Column(Integer, ForeignKey("work_groups.id"), nullable=False)
    web_crawler_id = Column(Integer, ForeignKey("web_crawlers.id"), nullable=False)
    
    created_at = Column(DateTime, default=datetime.now(timezone.utc))
    updated_at = Column(DateTime, default=datetime.now(timezone.utc), onupdate=datetime.now(timezone.utc))
    deleted_at = Column(DateTime, nullable=True)
    
    web_crawler = relationship("WebCrawler")
    work_group = relationship("WorkGroup", back_populates="work_group_web_crawlers")
