"""
Smart Calendar Assistant
Generated by Eden via recursive self-improvement
2025-10-28 02:08:44.566080
"""

class SmartCalendar:
    """
    An intelligent calendar assistant that helps manage events and schedule checks.
    
    Attributes:
        events (list): List of events stored as dictionaries with event details.
    """

    def __init__(self):
        """Initialize the calendar with an empty list of events."""
        self.events = []

    def add_event(self, name, date, start_time, end_time, description=None, location=None):
        """
        Add a new event to the calendar.
        
        Args:
            name (str): The name/title of the event.
            date (str): Date in 'YYYY-MM-DD' format.
            start_time (str): Start time in 'HH:MM' 24-hour format.
            end_time (str): End time in 'HH:MM' 24-hour format.
            description (str, optional): Description of the event. Defaults to None.
            location (str, optional): Location of the event. Defaults to None.
        """
        event = {
            'id': len(self.events) + 1,
            'name': name,
            'date': date,
            'start_time': start_time,
            'end_time': end_time,
            'description': description,
            'location': location
        }
        self.events.append(event)

    def check_availability(self, target_date, target_time):
        """
        Check if the user is available at a specific time.
        
        Args:
            target_date (str): Date in 'YYYY-MM-DD' format to check.
            target_time (str): Time in 'HH:MM' 24-hour format to check.
            
        Returns:
            bool: True if available, False if busy.
        """
        for event in self.events:
            # Convert times to minutes since midnight for comparison
            start = int(event['start_time'].replace(':', '').lstrip('0',))
            end = int(event['end_time'].replace(':', '').lstrip('0',))
            target = int(target_time.replace(':', '').lstrip('0',))
            
            if event['date'] == target_date:
                # Check if the target time overlaps with any event
                if (target >= start and target <= end):
                    return False
        return True

    def get_upcoming_events(self, num_days=7):
        """
        Get a list of upcoming events within the next N days.
        
        Args:
            num_days (int, optional): Number of days to look ahead. Defaults to 7.
            
        Returns:
            list: Sorted list of upcoming events by time.
        """
        from datetime import datetime, timedelta
        
        today = datetime.today().date()
        upcoming = []
        
        for event in self.events:
            event_date = datetime.strptime(event['date'], '%Y-%m-%d').date()
            if (event_date - today).days <= num_days and (event_date - today).days >= 0:
                upcoming.append(event)
                
        # Remove duplicates and sort by time
        unique_events = []
        seen_times = set()
        
        for event in sorted(upcoming, key=lambda x: x['start_time']):
            event_time = f"{event['date']} {x['start_time']}"
            if event_time not in seen_times:
                seen_times.add(event_time)
                unique_events.append({
                    'id': event['id'],
                    'name': event['name'],
                    'start_time': event['start_time'],
                    'end_time': event['end_time'],
                    'description': event['description']
                })
        return unique_events

# Example usage
if __name__ == "__main__":
    calendar = SmartCalendar()
    
    # Add some events
    calendar.add_event("Dental Appointment", "2023-10-15", "09:00", "10:00", 
                      "Checkup at Dr. Smith's office.", "Downtown Clinic")
    calendar.add_event("Team Meeting", "2023-10-17", "14:00", "16:00", 
                      "Q3 Review and Planning")
    
    # Check availability
    print(calendar.check_availability("2023-10-15", "09:30"))  # Should return False
    
    # Get upcoming events
    upcoming = calendar.get_upcoming_events()
    print("\nUpcoming Events:")
    for event in upcoming:
        print(f"{event['name']} - {event['start_time']}")