"""
CalendarEventSummarizer
Generated by Eden via recursive self-improvement
2025-10-27 19:25:04.415593
"""

class CalendarEventSummarizer:
    """
    A class to summarize calendar events from multiple sources into a single view.
    
    Attributes:
        events (dict): Dictionary to store calendar events, keyed by date.
        date_range (tuple): Start and end dates for summarization.
        time_zone (str): Time zone for the calendar events.
        
    Methods:
        add_google_calendar_events(events):
            Adds events from Google Calendar format.
            
        add_outlook_calendar_events(events):
            Adds events from Outlook Calendar format.
            
        filter_events(criteria):
            Filters events based on given criteria.
            
        summarize():
            Summarizes events into daily time slots.
            
        display_summary():
            Prints the summarized calendar in a readable format.
    """
    
    def __init__(self, start_date=None, end_date=None, time_zone='UTC'):
        self.events = {}
        self.date_range = (start_date, end_date) if start_date and end_date else (None, None)
        self.time_zone = time_zone
        
    def add_google_calendar_events(self, events):
        """
        Adds Google Calendar formatted events to the summary.
        
        Args:
            events (list): List of dictionaries in Google Calendar format.
        """
        for event in events:
            date = event['start']['date']
            if date not in self.events:
                self.events[date] = []
            self.events[date].append({
                'title': event['summary'],
                'time': f"{event['start']['time']}-{event['end']['time']}"
            })
    
    def add_outlook_calendar_events(self, events):
        """
        Adds Outlook Calendar formatted events to the summary.
        
        Args:
            events (list): List of dictionaries in Outlook Calendar format.
        """
        for event in events:
            date = event['start']['date']
            if date not in self.events:
                self.events[date] = []
            self.events[date].append({
                'title': event['subject'],
                'time': f"{event['start']['time']}-{event['end']['time']}"
            })
    
    def filter_events(self, criteria):
        """
        Filters events based on given criteria.
        
        Args:
            criteria (dict): Dictionary with keys like 'min_duration' or 'exclude_days'.
        """
        filtered_events = {}
        for date, events in self.events.items():
            filtered_date_events = []
            for event in events:
                keep_event = True
                for key, value in criteria.items():
                    if key == 'min_duration':
                        duration = self._calculate_duration(event['time'])
                        if duration < value:
                            keep_event = False
                    elif key == 'exclude_days':
                        if date in value:
                            keep_event = False
                if keep_event:
                    filtered_date_events.append(event)
            if filtered_date_events:
                filtered_events[date] = filtered_date_events
        self.events = filtered_events
    
    def _calculate_duration(self, time_str):
        """
        Internal method to calculate duration of an event from its time string.
        
        Args:
            time_str (str): Time in 'HH:MM-HH:MM' format.
            
        Returns:
            int: Duration in minutes.
        """
        start, end = time_str.split('-')
        start_min = self._convert_time_to_minutes(start)
        end_min = self._convert_time_to_minutes(end)
        return end_min - start_min
    
    def _convert_time_to_minutes(self, time):
        """
        Internal method to convert HH:MM time format to total minutes.
        
        Args:
            time (str): Time in 'HH:MM' format.
            
        Returns:
            int: Total minutes since midnight.
        """
        hours, mins = map(int, time.split(':'))
        return hours * 60 + mins
    
    def summarize(self):
        """
        Summarizes events into daily time slots.
        
        Returns:
            dict: Dictionary of dates with summarized event schedules.
        """
        summary = {}
        for date, events in self.events.items():
            if not events:
                continue
            sorted_events = sorted(events, key=lambda x: self._convert_time_to_minutes(x['time'].split('-')[0]))
            free_time = 900  # 15 minutes in minutes since midnight
            day_schedule = []
            for event in sorted_events:
                start_time = self._convert_time_to_minutes(event['time'].split('-')[0])
                end_time = start_time + self._calculate_duration(event['time'])
                if free_time < start_time:
                    day_schedule.append(('Free Time', f"{free_time:04d}:{(free_time % 60):02d}-{start_time:04d}:{(start_time % 60):02d}"))
                    free_time = end_time
                day_schedule.append((event['title'], event['time']))
                if end_time > free_time:
                    free_time = end_time + self._calculate_duration(event['time']) // 2  # Add buffer time
            if free_time < 1440:  # 1440 minutes is 24 hours
                day_schedule.append(('Free Time', f"{free_time:04d}:{(free_time % 60):02d}-Next Day"))
            summary[date] = day_schedule
        return summary
    
    def display_summary(self):
        """
        Prints the summarized calendar in a readable format.
        """
        for date, events in self.summarize().items():
            print(f"\nDate: {date}")
            print("-" * 50)
            for event in events:
                print(f"{event[0]}: {event[1]}")
    
# Example usage
if __name__ == "__main__":
    summarizer = CalendarEventSummarizer(start_date='2023-10-01', end_date='2023-10-03')
    
    # Add Google Calendar events
    google_events = [
        {
            'summary': 'Team Meeting',
            'start': {'date': '2023-10-01', 'time': '10:00'},
            'end': {'date': '2023-10-01', 'time': '11:00'}
        },
        {
            'summary': 'Client Call',
            'start': {'date': '2023-10-02', 'time': '14:00'},
            'end': {'date': '2023-10-02', 'time': '15:30'}
        }
    ]
    summarizer.add_google_calendar_events(google_events)
    
    # Add Outlook Calendar events
    outlook_events = [
        {
            'subject': 'Project Review',
            'start': {'date': '2023-10-01', 'time': '09:00'},
            'end': {'date': '2023-10-01', 'time': '10:30'}
        },
        {
            'subject': 'Strategy Discussion',
            'start': {'date': '2023-10-03', 'time': '08:00'},
            'end': {'date': '2023-10-03', 'time': '09:00'}
        }
    ]
    summarizer.add_outlook_calendar_events(outlook_events)
    
    # Filter events (example criteria)
    criteria = {
        'min_duration': 60,  # Minimum duration in minutes
        'exclude_days': ['2023-10-01']
    }
    summarizer.filter_events(criteria)
    
    # Display summary
    summarizer.display_summary()