"""
Pydantic models for calendar operations
"""
from pydantic import BaseModel, Field, EmailStr
from typing import Optional, List, Dict, Any
from datetime import datetime
from enum import Enum
class EventStatus(str, Enum):
"""Calendar event status"""
CONFIRMED = "confirmed"
TENTATIVE = "tentative"
CANCELLED = "cancelled"
class EventType(str, Enum):
"""Calendar event types"""
MEETING = "meeting"
FOCUS_TIME = "focus_time"
REMINDER = "reminder"
OUT_OF_OFFICE = "out_of_office"
INTERVIEW = "interview"
PERSONAL = "personal"
OTHER = "other"
class ReminderType(str, Enum):
"""Reminder types"""
EMAIL = "email"
POPUP = "popup"
class Attendee(BaseModel):
"""Event attendee"""
email: EmailStr
display_name: Optional[str] = None
response_status: str = "needsAction" # accepted, declined, tentative, needsAction
optional: bool = False
organizer: bool = False
class EventReminder(BaseModel):
"""Event reminder"""
method: ReminderType
minutes: int = Field(..., ge=0, description="Minutes before event")
class CalendarEvent(BaseModel):
"""Calendar event data model"""
id: Optional[str] = None
calendar_id: str = "primary"
summary: str = Field(..., description="Event title")
description: Optional[str] = None
location: Optional[str] = None
start: datetime = Field(..., description="Event start time")
end: datetime = Field(..., description="Event end time")
timezone: str = "America/New_York"
attendees: List[Attendee] = Field(default_factory=list)
reminders: List[EventReminder] = Field(default_factory=list)
status: EventStatus = EventStatus.CONFIRMED
event_type: Optional[EventType] = None
color_id: Optional[str] = None
conference_data: Optional[Dict[str, Any]] = None
recurrence: Optional[List[str]] = None
metadata: Dict[str, Any] = Field(default_factory=dict)
class CalendarEventFilter(BaseModel):
"""Filter for querying calendar events"""
calendar_id: str = "primary"
time_min: Optional[datetime] = None
time_max: Optional[datetime] = None
query: Optional[str] = None
event_types: Optional[List[EventType]] = None
attendee: Optional[str] = None
max_results: int = 100
class CalendarSummary(BaseModel):
"""Calendar summary"""
calendar_id: str
total_events: int
by_type: Dict[str, int]
upcoming_meetings: List[CalendarEvent]
conflicts: List[Dict[str, Any]]
free_slots: List[Dict[str, datetime]]
period: str
generated_at: datetime = Field(default_factory=datetime.now)
class MeetingConflict(BaseModel):
"""Meeting conflict detection"""
event1_id: str
event2_id: str
event1_summary: str
event2_summary: str
overlap_start: datetime
overlap_end: datetime
overlap_minutes: int