#!/usr/bin/env python3
"""Fix fonts and overlaps in Brandwatch deck."""

from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
import json

PRESENTATION_ID = "1MRxdQp2Njr-Z5s45c_kV3oC4X-devR4_u5_LpLQ6MpA"

with open('/root/.config/gws/credentials.json') as f:
    creds_data = json.load(f)

creds = Credentials(
    token=None,
    refresh_token=creds_data['refresh_token'],
    token_uri=creds_data['token_uri'],
    client_id=creds_data['client_id'],
    client_secret=creds_data['client_secret']
)

service = build('slides', 'v1', credentials=creds)
pres = service.presentations().get(presentationId=PRESENTATION_ID).execute()

# CE fonts: Larken → Playfair Display (closest Google Fonts serif), Inter for body
HEADING_FONT = 'Playfair Display'
BODY_FONT = 'Inter'

requests = []

for slide_idx, slide in enumerate(pres['slides']):
    for element in slide.get('pageElements', []):
        if 'shape' not in element:
            continue
        shape = element['shape']
        text_content = shape.get('text', {})
        text_elements = text_content.get('textElements', [])
        
        obj_id = element['objectId']
        
        for te in text_elements:
            if 'textRun' not in te:
                continue
            
            text = te['textRun']['content'].strip()
            style = te['textRun'].get('style', {})
            font_size = style.get('fontSize', {}).get('magnitude', 14)
            
            # Determine start/end index
            start = te.get('startIndex', 0)
            end = te.get('endIndex', start + len(te['textRun']['content']))
            
            # Headings (>= 22pt) get Playfair Display, body gets Inter
            if font_size >= 22:
                font = HEADING_FONT
            else:
                font = BODY_FONT
            
            requests.append({
                'updateTextStyle': {
                    'objectId': obj_id,
                    'style': {
                        'fontFamily': font,
                    },
                    'textRange': {
                        'type': 'FIXED_RANGE',
                        'startIndex': start,
                        'endIndex': end
                    },
                    'fields': 'fontFamily'
                }
            })

# Also fix any elements that might be overlapping - expand text boxes that are too small
# Check each slide for text boxes and ensure adequate sizing
for slide_idx, slide in enumerate(pres['slides']):
    for element in slide.get('pageElements', []):
        if 'shape' not in element:
            continue
        
        obj_id = element['objectId']
        shape = element['shape']
        
        # Get current size
        size = element.get('size', {})
        width = size.get('width', {}).get('magnitude', 0)
        height = size.get('height', {}).get('magnitude', 0)
        
        # Check if text content exists and might overflow
        text_content = shape.get('text', {})
        text_elements = text_content.get('textElements', [])
        
        full_text = ''
        max_font = 0
        for te in text_elements:
            if 'textRun' in te:
                full_text += te['textRun']['content']
                fs = te['textRun'].get('style', {}).get('fontSize', {}).get('magnitude', 14)
                max_font = max(max_font, fs)
        
        if not full_text.strip():
            continue
        
        # Estimate needed height based on text length and font size
        lines = full_text.count('\n') + 1
        chars_per_line = max(1, int(width / (max_font * 12700 * 0.6))) if width > 0 else 40
        wrapped_lines = lines
        for line in full_text.split('\n'):
            if len(line) > chars_per_line:
                wrapped_lines += len(line) // chars_per_line
        
        needed_height = int(wrapped_lines * max_font * 12700 * 1.5)
        
        # If needed height is significantly more than current, expand
        if needed_height > height * 1.3 and height > 0:
            new_height = int(needed_height * 1.1)
            # Get current transform
            transform = element.get('transform', {})
            
            requests.append({
                'updatePageElementTransform': {
                    'objectId': obj_id,
                    'applyMode': 'ABSOLUTE',
                    'transform': {
                        'scaleX': transform.get('scaleX', 1),
                        'scaleY': new_height / height if height > 0 else 1,
                        'translateX': transform.get('translateX', 0),
                        'translateY': transform.get('translateY', 0),
                        'shearX': transform.get('shearX', 0),
                        'shearY': transform.get('shearY', 0),
                        'unit': 'EMU'
                    }
                }
            })

# Batch in chunks of 100
for i in range(0, len(requests), 100):
    chunk = requests[i:i+100]
    service.presentations().batchUpdate(
        presentationId=PRESENTATION_ID,
        body={'requests': chunk}
    ).execute()
    print(f"Applied batch {i//100 + 1} ({len(chunk)} requests)")

print(f"\nTotal: {len(requests)} updates")
print(f"Deck: https://docs.google.com/presentation/d/{PRESENTATION_ID}/edit")
