from __future__ import annotations from enum import Enum from typing import List, Optional from pydantic import BaseModel, ConfigDict, EmailStr, Field class HealthStatus(BaseModel): status: str = "healthy" database: str = "connected" version: str = "1.0.0" class LifecycleType(str, Enum): renewal = "renewal" maintenance = "maintenance" warranty = "warranty" class ItemStatus(str, Enum): active = "active" completed = "completed" class ItemUrgency(str, Enum): overdue = "overdue" upcoming = "upcoming" normal = "normal" no_date = "no_date" completed = "completed" class DigestDeliveryTime(str, Enum): TIME_06 = "06:00" TIME_08 = "08:00" TIME_09 = "09:00" TIME_12 = "12:00" class User(BaseModel): id: str email: EmailStr name: str createdAt: str model_config = ConfigDict(populate_by_name=True) class UserInDB(User): hashed_password: str class AuthResponse(BaseModel): user: User token: str class SignupRequest(BaseModel): email: EmailStr password: str = Field(min_length=6) name: str class LoginRequest(BaseModel): email: EmailStr password: str class LifecycleItem(BaseModel): id: str name: str lifecycleType: LifecycleType dueDate: Optional[str] = None status: ItemStatus ownerId: str ownerEmail: EmailStr groupId: Optional[str] = None groupName: Optional[str] = None createdAt: str updatedAt: str model_config = ConfigDict(populate_by_name=True) class CreateItemDTO(BaseModel): name: str lifecycleType: LifecycleType dueDate: Optional[str] = None status: Optional[ItemStatus] = ItemStatus.active groupId: Optional[str] = None class UpdateItemDTO(BaseModel): name: Optional[str] = None lifecycleType: Optional[LifecycleType] = None dueDate: Optional[str] = None status: Optional[ItemStatus] = None groupId: Optional[str] = None class Group(BaseModel): id: str name: str ownerId: str ownerEmail: EmailStr memberEmails: List[EmailStr] createdAt: str model_config = ConfigDict(populate_by_name=True) class CreateGroupRequest(BaseModel): name: str class AddMemberRequest(BaseModel): email: EmailStr class DailyDigestConfig(BaseModel): timeZone: str = "UTC" deliveryTime: DigestDeliveryTime = DigestDeliveryTime.TIME_08 enabled: bool = True model_config = ConfigDict(populate_by_name=True) class UpdateDigestConfigRequest(BaseModel): timeZone: Optional[str] = None deliveryTime: Optional[DigestDeliveryTime] = None enabled: Optional[bool] = None class DailyDigestEmail(BaseModel): id: str recipientEmail: EmailStr recipientName: str generatedAt: str deliveryTime: DigestDeliveryTime timeZone: str subject: str overdueCount: int upcomingCount: int overdueItems: List[LifecycleItem] upcomingItems: List[LifecycleItem] htmlContent: str textContent: str model_config = ConfigDict(populate_by_name=True) class GenerateDigestRequest(BaseModel): recipientEmail: Optional[EmailStr] = None class RemindersSummary(BaseModel): overdue: List[LifecycleItem] upcoming: List[LifecycleItem] totalActiveReminders: int class ErrorResponse(BaseModel): error: str class MessageResponse(BaseModel): message: str