from datetime import datetime from typing import List, Optional from pydantic import BaseModel, Field class CommentCreateRequest(BaseModel): nickname: Optional[str] = Field(None, min_length=1, max_length=50, description="작성자 닉네임 (미입력 시 익명)") content: str = Field(..., min_length=1, max_length=100, description="댓글 본문 (한글 기준 100자 이내)") parent_id: Optional[int] = Field(None, description="대댓글일 때만 부모 댓글 id") class ReplyItem(BaseModel): """대댓글 응답""" id: int = Field(..., description="댓글 고유 ID") nickname: str = Field(..., description="작성자 닉네임 (미입력 시 '익명')") content: Optional[str] = Field(None, description="본문 (소프트 삭제된 경우 null)") is_deleted: bool = Field(..., description="삭제 여부") is_mine: bool = Field(..., description="현재 로그인 사용자의 댓글 여부") created_at: datetime = Field(..., description="작성 일시") class CommentItem(BaseModel): """최상위 댓글 응답 — replies 포함""" id: int = Field(..., description="댓글 고유 ID") nickname: str = Field(..., description="작성자 닉네임 (미입력 시 '익명')") content: Optional[str] = Field(None, description="본문 (소프트 삭제된 경우 null)") is_deleted: bool = Field(..., description="삭제 여부") is_mine: bool = Field(..., description="현재 로그인 사용자의 댓글 여부") created_at: datetime = Field(..., description="작성 일시") replies: List[ReplyItem] = Field(default_factory=list, description="대댓글 목록") class CommentCreateResponse(BaseModel): id: int = Field(..., description="생성된 댓글 고유 ID") nickname: str = Field(..., description="작성자 닉네임 (미입력 시 '익명')") parent_id: Optional[int] = Field(None, description="부모 댓글 id (대댓글인 경우)") content: str = Field(..., description="댓글 본문") created_at: datetime = Field(..., description="작성 일시") class DeleteCommentResponse(BaseModel): success: bool = Field(..., description="삭제 성공 여부") comment_id: int = Field(..., description="삭제된 댓글 ID") message: str = Field(..., description="결과 메시지")