import os
import json
import datetime
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from agent.oauth_store import get_credentials

def execute(inputs: dict) -> dict:
    # Look up user_id from the environment variables injected by SkillExecutor
    user_id = os.environ.get("USER_ID")
    if not user_id:
        return {"error": "Authentication required. No user_id found in environment."}

    creds_dict = get_credentials(user_id)
    if not creds_dict:
        return {"error": "Google Calendar is not connected. Please ask the user to click 'Connect Google Calendar' in the sidebar to authorize access."}

    try:
        # Rebuild the credentials object
        creds = Credentials(
            token=creds_dict.get('token'),
            refresh_token=creds_dict.get('refresh_token'),
            token_uri=creds_dict.get('token_uri'),
            client_id=creds_dict.get('client_id'),
            client_secret=creds_dict.get('client_secret'),
            scopes=creds_dict.get('scopes')
        )
        
        service = build('calendar', 'v3', credentials=creds)
        
        # Calculate time bounds
        days_ahead = inputs.get('days_ahead', 1)
        now = datetime.datetime.utcnow().isoformat() + 'Z'  # 'Z' indicates UTC time
        end_time = (datetime.datetime.utcnow() + datetime.timedelta(days=days_ahead)).isoformat() + 'Z'
        
        events_result = service.events().list(
            calendarId='primary', timeMin=now, timeMax=end_time,
            maxResults=50, singleEvents=True,
            orderBy='startTime'
        ).execute()
        
        events = events_result.get('items', [])
        
        if not events:
            return {"message": f"No upcoming events found for the next {days_ahead} day(s)."}
        
        # Format the events nicely
        formatted_events = []
        for event in events:
            start = event['start'].get('dateTime', event['start'].get('date'))
            end = event['end'].get('dateTime', event['end'].get('date'))
            formatted_events.append({
                "summary": event.get('summary', 'No Title'),
                "start": start,
                "end": end,
                "description": event.get('description', ''),
                "link": event.get('htmlLink', ''),
                "event_id": event.get('id', '')
            })
            
        return {
            "events_count": len(formatted_events),
            "events": formatted_events
        }
        
    except Exception as e:
        return {"error": f"Failed to fetch calendar events: {str(e)}"}
