"""Modèle StoryFavorite pour les favoris sur les histoires publiées."""

import uuid
from datetime import datetime

from sqlalchemy import String, DateTime, ForeignKey
from sqlalchemy.orm import Mapped, mapped_column, relationship
from models.user import db


class StoryFavorite(db.Model):
    """Modèle représentant un favori sur une histoire publiée.
    
    Attributes:
        id: Identifiant unique (UUID).
        user_id: ID de l'utilisateur.
        story_id: ID de l'histoire mise en favori.
        created_at: Date de mise en favori.
    """
    
    __tablename__ = 'story_favorites'
    
    # Primary Key
    id: Mapped[str] = mapped_column(
        String(36),
        primary_key=True,
        default=lambda: str(uuid.uuid4())
    )
    
    # Foreign Keys
    user_id: Mapped[str] = mapped_column(
        String(36),
        ForeignKey('users.id', ondelete='CASCADE'),
        nullable=False,
        index=True
    )
    story_id: Mapped[str] = mapped_column(
        String(36),
        ForeignKey('stories.id', ondelete='CASCADE'),
        nullable=False,
        index=True
    )
    
    # Timestamp
    created_at: Mapped[datetime] = mapped_column(
        DateTime,
        default=datetime.utcnow,
        nullable=False
    )
    
    # Relationships
    user: Mapped["User"] = relationship(
        "User",
        back_populates="favorite_stories"
    )
    story: Mapped["Story"] = relationship(
        "Story",
        back_populates="favorites"
    )
    
    # Contrainte unique : un user ne peut mettre qu'une fois en favori la même story
    __table_args__ = (
        db.UniqueConstraint('user_id', 'story_id', name='unique_user_story_favorite'),
    )
    
    def __repr__(self) -> str:
        """Représentation string du StoryFavorite."""
        return f"<StoryFavorite user={self.user_id} story={self.story_id}>"
    
    def to_dict(self) -> dict:
        """Convertit le StoryFavorite en dictionnaire.
        
        Returns:
            Dictionnaire avec les informations du favori.
        """
        return {
            'id': self.id,
            'user_id': self.user_id,
            'story_id': self.story_id,
            'created_at': self.created_at.isoformat()
        }

