from datetime import datetime, timedelta from icalendar import Calendar, Event from pathlib import Path import pytz async def create_calendar_event( title: str, start: str, end: str, description: str = '', location: str = '' ) -> dict: """ Create ICS calendar event Args: title: Event title start: Start datetime (ISO format or natural language) end: End datetime (ISO format or natural language) description: Event description location: Event location Returns: Dict with ICS file path """ try: # Parse dates start_dt = parse_datetime(start) end_dt = parse_datetime(end) # Create calendar cal = Calendar() cal.add('prodid', '-//LifeAdmin AI//lifeadmin.ai//') cal.add('version', '2.0') # Create event event = Event() event.add('summary', title) event.add('dtstart', start_dt) event.add('dtend', end_dt) event.add('description', description) if location: event.add('location', location) event.add('dtstamp', datetime.now(pytz.UTC)) # Generate unique ID import uuid event.add('uid', str(uuid.uuid4())) cal.add_component(event) # Save to file output_path = f"data/outputs/event_{datetime.now().strftime('%Y%m%d_%H%M%S')}.ics" Path(output_path).parent.mkdir(parents=True, exist_ok=True) with open(output_path, 'wb') as f: f.write(cal.to_ical()) return { 'success': True, 'output_path': output_path, 'event': { 'title': title, 'start': start_dt.isoformat(), 'end': end_dt.isoformat(), 'description': description } } except Exception as e: return {'error': str(e), 'success': False} def parse_datetime(dt_string: str) -> datetime: """Parse datetime from various formats""" try: # Try ISO format return datetime.fromisoformat(dt_string.replace('Z', '+00:00')) except: pass try: # Try common formats for fmt in ['%Y-%m-%d %H:%M', '%Y-%m-%d', '%m/%d/%Y %H:%M', '%m/%d/%Y']: try: dt = datetime.strptime(dt_string, fmt) return pytz.UTC.localize(dt) except: continue except: pass # Default to now return datetime.now(pytz.UTC) async def create_multiple_events(events: list) -> dict: """Create multiple calendar events from a list""" results = [] for event_data in events: result = await create_calendar_event(**event_data) results.append(result) successful = sum(1 for r in results if r.get('success')) return { 'success': True, 'total_events': len(events), 'successful': successful, 'results': results }