import datetime

class PRDExecutionTracker:
    def __init__(self, prds=None):
        self.prds = prds if prds is not None else []

    def add_prd(self, prd):
        required_keys = ['id', 'title', 'status', 'stories']
        if not all(key in prd for key in required_keys):
            raise ValueError(f'Missing required PRD fields: {required_keys}')
        
        for story in prd['stories']:
            required_story_keys = ['id', 'title', 'status', 'estimated_completion']
            if not all(key in story for key in required_story_keys):
                raise ValueError(f'Missing required story fields: {required_story_keys}')
        
        self.prds.append(prd)
        return self

    def update_prd(self, prd_id, updates):
        for prd in self.prds:
            if prd['id'] == prd_id:
                prd.update(updates)
                return self
        raise ValueError(f'PRD with id {prd_id} not found')

    def get_all_prds(self):
        return self.prds

    def display_status(self):
        report = {
            'total_prds': len(self.prds),
            'prds': []
        }
        
        for prd in self.prds:
            stories = prd['stories']
            completed = sum(1 for s in stories if s['status'] == 'Completed')
            
            report['prds'].append({
                'id': prd['id'],
                'title': prd['title'],
                'status': prd['status'],
                'stories': stories,
                'stories_completed': completed,
                'stories_pending': len(stories) - completed,
                'estimated_completion': self._calculate_prd_completion(stories)
            })
        
        return report

    def _calculate_prd_completion(self, stories):
        if not stories:
            return None
        
        # Sort stories by estimated_completion date
        sorted_stories = sorted(
            [s for s in stories if s['estimated_completion']],
            key=lambda x: datetime.datetime.strptime(x['estimated_completion'], '%Y-%m-%d')
        )
        
        # Return the latest estimated_completion date
        return sorted_stories[-1]['estimated_completion'] if sorted_stories else None

# Example usage
if __name__ == '__main__':
    tracker = PRDExecutionTracker()
    
    tracker.add_prd({
        'id': 'prd-001',
        'title': 'User Authentication',
        'status': 'In Progress',
        'stories': [
            {
                'id': 'story-001',
                'title': 'Login Page',
                'status': 'Completed',
                'estimated_completion': '2023-10-15'
            },
            {
                'id': 'story-002',
                'title': 'Password Reset',
                'status': 'In Progress',
                'estimated_completion': '2023-10-20'
            }
        ]
    })
    
    tracker.update_prd('prd-001', {'status': 'Completed'})
    
    print(tracker.display_status())