#!/usr/bin/env python3
"""Google Calendar CLI for Clawdbot - Read calendar events."""

import argparse
import json
import os
import sys
from datetime import datetime, timedelta
from pathlib import Path

# Google API imports
try:
    from google.auth.transport.requests import Request
    from google.oauth2.credentials import Credentials
    from google_auth_oauthlib.flow import InstalledAppFlow
    from googleapiclient.discovery import build
    from googleapiclient.errors import HttpError
except ImportError:
    print("Error: Google API libraries not installed.")
    sys.exit(1)

# Calendar API scopes
SCOPES = [
    'https://www.googleapis.com/auth/calendar.readonly',
]

# Config paths - reuse Gmail credentials location
CONFIG_DIR = Path.home() / '.clawdbot' / 'skills' / 'gmail'
TOKENS_DIR = CONFIG_DIR / 'tokens'
CREDENTIALS_FILE = CONFIG_DIR / 'credentials.json'
CALENDAR_TOKEN = TOKENS_DIR / 'calendar.json'


def get_credentials():
    """Get or refresh credentials for Calendar API."""
    creds = None
    
    if CALENDAR_TOKEN.exists():
        creds = Credentials.from_authorized_user_file(str(CALENDAR_TOKEN), SCOPES)
    
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            if not CREDENTIALS_FILE.exists():
                print(f"Error: No credentials file at {CREDENTIALS_FILE}")
                sys.exit(1)
            flow = InstalledAppFlow.from_client_secrets_file(str(CREDENTIALS_FILE), SCOPES)
            creds = flow.run_local_server(port=0)
        
        with open(CALENDAR_TOKEN, 'w') as f:
            f.write(creds.to_json())
    
    return creds


def list_events(days=7, calendar_id='primary'):
    """List upcoming events."""
    creds = get_credentials()
    service = build('calendar', 'v3', credentials=creds)
    
    now = datetime.utcnow()
    time_min = now.isoformat() + 'Z'
    time_max = (now + timedelta(days=days)).isoformat() + 'Z'
    
    try:
        events_result = service.events().list(
            calendarId=calendar_id,
            timeMin=time_min,
            timeMax=time_max,
            maxResults=50,
            singleEvents=True,
            orderBy='startTime'
        ).execute()
        
        events = events_result.get('items', [])
        
        if not events:
            print('No upcoming events found.')
            return
        
        current_date = None
        for event in events:
            start = event['start'].get('dateTime', event['start'].get('date'))
            
            # Parse the date
            if 'T' in start:
                dt = datetime.fromisoformat(start.replace('Z', '+00:00'))
                event_date = dt.strftime('%A, %B %d')
                event_time = dt.strftime('%I:%M %p')
            else:
                dt = datetime.strptime(start, '%Y-%m-%d')
                event_date = dt.strftime('%A, %B %d')
                event_time = 'All day'
            
            # Print date header if new day
            if event_date != current_date:
                if current_date:
                    print()
                print(f"📅 {event_date}")
                print("-" * 40)
                current_date = event_date
            
            summary = event.get('summary', '(No title)')
            location = event.get('location', '')
            
            print(f"  {event_time}: {summary}")
            if location:
                print(f"    📍 {location}")
            
            # Show attendees if any
            attendees = event.get('attendees', [])
            external = [a['email'] for a in attendees if not a['email'].endswith('@gmail.com') and not a.get('self')]
            if external:
                print(f"    👥 {', '.join(external[:3])}")
                
    except HttpError as error:
        print(f'Calendar API error: {error}')
        sys.exit(1)


def main():
    parser = argparse.ArgumentParser(description='Google Calendar CLI')
    parser.add_argument('command', choices=['events', 'auth', 'today', 'week'],
                       help='Command to run')
    parser.add_argument('--days', type=int, default=7, help='Number of days to show')
    parser.add_argument('--calendar', default='primary', help='Calendar ID')
    
    args = parser.parse_args()
    
    if args.command == 'auth':
        creds = get_credentials()
        print("Calendar authentication successful!")
    elif args.command == 'events':
        list_events(days=args.days, calendar_id=args.calendar)
    elif args.command == 'today':
        list_events(days=1, calendar_id=args.calendar)
    elif args.command == 'week':
        list_events(days=7, calendar_id=args.calendar)


if __name__ == '__main__':
    main()
