#!/usr/bin/env python3
"""Read emails from a Gmail account"""

import argparse
import base64
import json
import sys
from pathlib import Path

try:
    from google.oauth2.credentials import Credentials
    from googleapiclient.discovery import build
except ImportError:
    print("Error: Google API libraries not installed")
    sys.exit(1)

def read_emails(token_path: str, query: str = "", max_results: int = 10) -> list:
    """Read emails from Gmail account"""
    
    token_file = Path(token_path)
    if not token_file.exists():
        return {"error": f"Token not found at {token_path}"}
    
    creds = Credentials.from_authorized_user_file(str(token_file))
    service = build('gmail', 'v1', credentials=creds)
    
    try:
        # List messages
        results = service.users().messages().list(
            userId='me',
            q=query,
            maxResults=max_results
        ).execute()
        
        messages = results.get('messages', [])
        
        emails = []
        for msg in messages:
            # Get full message details
            full_msg = service.users().messages().get(
                userId='me',
                id=msg['id'],
                format='full'
            ).execute()
            
            headers = full_msg.get('payload', {}).get('headers', [])
            
            # Extract key headers
            email_data = {
                'id': msg['id'],
                'threadId': full_msg.get('threadId'),
                'snippet': full_msg.get('snippet', '')[:200],
            }
            
            for header in headers:
                name = header['name'].lower()
                if name in ['from', 'to', 'subject', 'date', 'cc']:
                    email_data[name] = header['value']
            
            # Try to get body
            payload = full_msg.get('payload', {})
            body = ""
            
            if 'body' in payload and payload['body'].get('data'):
                body = base64.urlsafe_b64decode(payload['body']['data']).decode('utf-8', errors='ignore')
            elif 'parts' in payload:
                for part in payload['parts']:
                    if part.get('mimeType') == 'text/plain' and part.get('body', {}).get('data'):
                        body = base64.urlsafe_b64decode(part['body']['data']).decode('utf-8', errors='ignore')
                        break
                    elif part.get('mimeType') == 'text/html' and part.get('body', {}).get('data') and not body:
                        body = base64.urlsafe_b64decode(part['body']['data']).decode('utf-8', errors='ignore')
            
            email_data['body'] = body[:3000] if body else ""
            emails.append(email_data)
        
        return emails
        
    except Exception as e:
        return {"error": str(e)}


def main():
    parser = argparse.ArgumentParser(description='Read emails from Gmail')
    parser.add_argument('--token', required=True, help='Path to token JSON file')
    parser.add_argument('--query', default='', help='Gmail search query')
    parser.add_argument('--max', type=int, default=10, help='Max results')
    
    args = parser.parse_args()
    
    result = read_emails(args.token, args.query, args.max)
    print(json.dumps(result, indent=2, ensure_ascii=False))


if __name__ == '__main__':
    main()
