import uuid
from datetime import datetime, timezone
from sqlalchemy import Boolean, DateTime, ForeignKey, Index, String, Text
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import Mapped, mapped_column
from app.db.base import Base

class Notification(Base):
    __tablename__='notifications'
    __table_args__=(Index('ix_notifications_business_read_created','business_id','is_read','created_at'),)
    id:Mapped[uuid.UUID]=mapped_column(UUID(as_uuid=True),primary_key=True,default=uuid.uuid4)
    business_id:Mapped[uuid.UUID]=mapped_column(UUID(as_uuid=True),ForeignKey('businesses.id',ondelete='CASCADE'),nullable=False,index=True)
    branch_id:Mapped[uuid.UUID|None]=mapped_column(UUID(as_uuid=True),ForeignKey('branches.id',ondelete='CASCADE'),nullable=True,index=True)
    user_id:Mapped[uuid.UUID|None]=mapped_column(UUID(as_uuid=True),ForeignKey('users.id',ondelete='CASCADE'),nullable=True,index=True)
    category:Mapped[str]=mapped_column(String(30),nullable=False)
    title:Mapped[str]=mapped_column(String(200),nullable=False)
    message:Mapped[str]=mapped_column(Text,nullable=False)
    related_entity_type:Mapped[str|None]=mapped_column(String(50))
    related_entity_id:Mapped[uuid.UUID|None]=mapped_column(UUID(as_uuid=True))
    is_read:Mapped[bool]=mapped_column(Boolean,nullable=False,default=False,index=True)
    read_at:Mapped[datetime|None]=mapped_column(DateTime(timezone=True))
    created_at:Mapped[datetime]=mapped_column(DateTime(timezone=True),nullable=False,default=lambda:datetime.now(timezone.utc),index=True)
