"""Modèle StoryLike pour les likes 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 StoryLike(db.Model):
    """Modèle représentant un like sur une histoire publiée.
    
    Attributes:
        id: Identifiant unique (UUID).
        user_id: ID de l'utilisateur qui a liké.
        story_id: ID de l'histoire likée.
        created_at: Date du like.
    """
    
    __tablename__ = 'story_likes'
    
    # 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="liked_stories"
    )
    story: Mapped["Story"] = relationship(
        "Story",
        back_populates="likes"
    )
    
    # Contrainte unique : un user ne peut liker qu'une fois la même story
    __table_args__ = (
        db.UniqueConstraint('user_id', 'story_id', name='unique_user_story_like'),
    )
    
    def __repr__(self) -> str:
        """Représentation string du StoryLike."""
        return f"<StoryLike user={self.user_id} story={self.story_id}>"
    
    def to_dict(self) -> dict:
        """Convertit le StoryLike en dictionnaire.
        
        Returns:
            Dictionnaire avec les informations du like.
        """
        return {
            'id': self.id,
            'user_id': self.user_id,
            'story_id': self.story_id,
            'created_at': self.created_at.isoformat()
        }

