#!/usr/bin/env python3
"""Process Gmail contacts and add to Notion."""

import re
import json
import requests
from collections import defaultdict

NOTION_API_KEY = "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"
CONTACTS_INBOX_DB = "2f0330c2-8646-814e-af5a-c7d3b36030ef"
PEOPLE_DIRECTORY_DB = "142acbed-9e19-48e0-911f-2fc6513b564d"

# Automated email patterns to filter out
AUTOMATED_PATTERNS = [
    r'noreply|no-reply|no_reply', r'notifications?@', r'newsletter', r'donotreply',
    r'mailer-daemon', r'postmaster@', r'support@', r'info@news\.', r'hello@news\.',
    r'updates@', r'alerts?@', r'billing@', r'receipts?@', r'invoice', r'marketing@',
    r'promo@', r'sales@', r'team@email\.', r'digest@', r'@e\..*\.com', r'@mail\..*\.com',
    r'@info\..*\.com', r'advertise-', r'security@updates', r'comments-noreply',
    r'via (google|figma|linkedin)', r'@tm\.openai\.com', r'@substack\.com',
    r'noreply@', r'@em-s\.', r'@eonline\.', r'@em\.', r'@marketing\.',
]

AUTOMATED_SENDERS = [
    'meta for business', 'anthropic', 'audible', 'linear', 'github', 'google',
    'stripe', 'namecheap', 'american express', 'amex', 'classdojo', 'adobe',
    'pixel surplus', 'nyt cooking', 'the defiant', 'vanguard', 'easypark', 'behance',
    'homeexchange', 'retrosupply', 'cos', 'awwwards', 'brave search', 'tl;dv',
    'rehunt', 'lovable', 'beckett simonon', 'granvine', 'buraca roasters', 'merchery',
    'vml intelligence', 'mockup.maison', 'userlist', 'claude team', 'anthropic team',
    'the new school', 'kindred', 'atlantax', "new york's 529", 'chatgpt', 'openai',
    'chase', 'coinbase', 'facebook', 'instagram', 'linkedin', 'twitter', 'xbox',
    'audible.com', 'netflix', 'uber', 'airbnb', 'booking.com', 'amazon', 'apple',
    'microsoft', 'zoom', 'dropbox', 'figma', 'notion', 'slack', 'trello', 'asana',
    'todoist', 'evernote', 'todoist', 'mailchimp', 'sendgrid', 'mailgun', 'postmark',
    'meo', 'tap air', 'aegean', 'flying blue', 'mcdonalds', 'ikea', 'decathlon',
    'auchan', 'battlefield', 'ea', 'sedition', 'drool', 'surfline', 'true grit',
    'hulken', 'clixo', 'brilliant', 'medium', 'substack', 'keeps', 'oscar',
    'dashlane', 'stuffthatworks', 'clay team', 'spline', 'letzai', 'flora',
    'mymind', 'toshl', 'equifax', 'robinhood', 'magic pass', 'lottiefiles',
    'eventbrite', 'football ticket', 'telpark', 'cuf', 'olx', 'via verde',
    'jumpspeak', 'later', 'trx training', 'gustin', 'a-dam', 'cos', 'malin',
    'snipd', 'hatch', 'animal flow', 'womp', 'stendig', 'catbird', 'avene',
    'red antler', 'gap', 'hipstamatic', 'provedg', 'unicorn studio', 'loom',
    'scrapingbee', 'supabase', 'wetransfer', 'bmagic', 'ticketmaster', 'skype',
    'under design', 'house of mockups', 'iframelab', 'frame type', 'aura frames',
    'base44', 'locallista', 'the little gym', 'hello park', 'patas tenras',
    'jazzy dance', 'basket belenenses', 'yelp', 'mint mobile', 'pmf labs',
    'clutch', 'moo business', 'transatlantic', 'stuff that works', 'perplexity',
    'replicate', 'design reviewed', 'lemon squeezy', 'thinkbuff', 'macpaw',
]

# Raw email data (extracted from the search results)
RAW_EMAIL_DATA = """
David Haliva <david@haliva.co.il>
Daniel Trau <daniel@torix.tv>
Roi Ben Itzhak <roi.benitzhak@gmail.com>
Jonathan Dagan <j.viewz@gmail.com>
Stephen Boush <stephen.boush@atlantax.com>
Fiona Conrad <fiona.conrad@gmail.com>
Fiona Conrad <fionaconrad@icloud.com>
Rui Borges <Rui.Borges@goalseek.pt>
Anthony Wolch <awolch@beyondmg.ca>
Mounia Mikou <mm@mouniamikou.com>
Niv Baibich <niv.baibich@gmail.com>
didier <didierdormoy@bluewin.ch>
Teresa Pala Schwalbach <tps@servulo.com>
Rui Magalhaes <rui@dmatax.pt>
Info Daniel Monteiro <info@dmatax.pt>
Nitay Dagan <nitay.dagan@gmail.com>
Tiago Vieira da Silva <tsilva@mail.telepac.pt>
Yael Dagan <yaelavan@gmail.com>
Jon Margolis <jmargolis@beyondmg.ca>
Ana Capelinha <AnaCapelinha@elevate-accounting.com>
Danielle Nogueira de Sa <danielle@daninog.com>
CNT Avocats - Drª Cátia Neves <catianevesteixeira@lawyer.com>
Pedro Octávio de Niemeyer <pedrooctavio@niemeyer.pt>
Rebecca Castro <rebecca@freshpeople.pt>
Henrique Faria <henrique@freshpeople.pt>
Hadar Steinberg <hadar@curiousendeavor.com>
Eran Kadosh <EranK@amiryaniv.com>
Avrom Gilbert <avrom.gilbert@sparkbeyond.com>
Dan Peguine <danpeg@gmail.com>
Allie Rockwell <allie.rockwell@boundless.life>
Ben Lutz <ben.lutz@boundless.life>
michal hen <michal@mefathim.co.il>
Lolita <lolita@lolitaandco.com>
Moreira Ana (SOAUTO) <moreira.ana@soauto.pt>
Jennifer Schorer <jennifer@white-space.com>
WS Team US <WSTeamUS@white-space.com>
Geraldine Le Meur <geraldine@boundless.life>
Weber Wong <weber@florafauna.ai>
Adam Fard <adam@uxpilot.ai>
Laurent Goater <francaisduport@gmail.com>
Raphael Perez <raphael@israelijazz.com>
Luana (HomeExchange)
Sergei Chyrkov
Yonatan (Figma)
Natan (Figma)
Avraham Ben Zimra (Figma)
Magnolia Winebar <concierge@letsumail.com>
Burzo Ciprian (Figma)
Stéphane Vojetta <contact@stephanevoj.fr>
Nathalie Coggia <nathalie.coggia@gmail.com>
"""

def is_automated(from_field):
    """Check if email is from an automated sender."""
    fl = from_field.lower()
    for pattern in AUTOMATED_PATTERNS:
        if re.search(pattern, fl, re.IGNORECASE):
            return True
    for sender in AUTOMATED_SENDERS:
        if sender in fl:
            return True
    return False

def extract_email_name(from_field):
    """Extract name and email from From field."""
    match = re.match(r'^"?([^"<]+)"?\s*<([^>]+)>$', from_field.strip())
    if match:
        return match.group(1).strip().strip('"'), match.group(2).strip().lower()
    match = re.match(r'^([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})$', from_field.strip())
    if match:
        email = match.group(1).lower()
        name = email.split('@')[0].replace('.', ' ').replace('_', ' ').title()
        return name, email
    return None, None

def get_existing_contacts():
    """Get existing contacts from both Notion databases."""
    contacts = set()
    headers = {
        "Authorization": f"Bearer {NOTION_API_KEY}",
        "Notion-Version": "2022-06-28",
        "Content-Type": "application/json"
    }
    
    for db_id in [PEOPLE_DIRECTORY_DB, CONTACTS_INBOX_DB]:
        has_more = True
        cursor = None
        while has_more:
            payload = {"page_size": 100}
            if cursor:
                payload["start_cursor"] = cursor
            resp = requests.post(f"https://api.notion.com/v1/databases/{db_id}/query",
                               headers=headers, json=payload)
            if resp.status_code != 200:
                print(f"Error: {resp.text}")
                break
            data = resp.json()
            for r in data.get("results", []):
                props = r.get("properties", {})
                if "Name" in props and props["Name"].get("title"):
                    for t in props["Name"]["title"]:
                        if "text" in t:
                            contacts.add(t["text"]["content"].lower())
                if "Email" in props:
                    if props["Email"].get("email"):
                        contacts.add(props["Email"]["email"].lower())
            has_more = data.get("has_more", False)
            cursor = data.get("next_cursor")
    return contacts

def add_contact_to_notion(name, email, count, context):
    """Add contact to Notion Contacts Inbox."""
    headers = {
        "Authorization": f"Bearer {NOTION_API_KEY}",
        "Notion-Version": "2022-06-28",
        "Content-Type": "application/json"
    }
    
    properties = {
        "Name": {"title": [{"text": {"content": name}}]},
        "Email": {"email": email},
        "Email Count": {"number": count},
        "Source": {"select": {"name": "Gmail"}},
        "Context": {"rich_text": [{"text": {"content": context[:2000] if context else ""}}]},
    }
    
    payload = {
        "parent": {"database_id": CONTACTS_INBOX_DB},
        "properties": properties
    }
    
    resp = requests.post("https://api.notion.com/v1/pages", headers=headers, json=payload)
    return resp.status_code == 200, resp.text

# Manually curated contact list with context (from email scan)
CONTACTS = [
    {"name": "David Haliva", "email": "david@haliva.co.il", "count": 5, "context": "AI visualizations, furniture"},
    {"name": "Daniel Trau", "email": "daniel@torix.tv", "count": 8, "context": "Torix TV, media production"},
    {"name": "Roi Ben Itzhak", "email": "roi.benitzhak@gmail.com", "count": 2, "context": "Business follow-up"},
    {"name": "Stephen Boush", "email": "stephen.boush@atlantax.com", "count": 3, "context": "US-Portugal tax compliance"},
    {"name": "Rui Borges", "email": "rui.borges@goalseek.pt", "count": 5, "context": "GoalSeek, tax support"},
    {"name": "Anthony Wolch", "email": "awolch@beyondmg.ca", "count": 6, "context": "Website updates, See The Good"},
    {"name": "Mounia Mikou", "email": "mm@mouniamikou.com", "count": 2, "context": "Apartment documents"},
    {"name": "Niv Baibich", "email": "niv.baibich@gmail.com", "count": 4, "context": "Passable site meetings"},
    {"name": "Didier Dormoy", "email": "didierdormoy@bluewin.ch", "count": 1, "context": "Loan contract"},
    {"name": "Teresa Pala Schwalbach", "email": "tps@servulo.com", "count": 3, "context": "Legal/tax consultation"},
    {"name": "Rui Magalhaes", "email": "rui@dmatax.pt", "count": 2, "context": "DMA Tax, PT-US filings"},
    {"name": "Ana Capelinha", "email": "anacapelinha@elevate-accounting.com", "count": 1, "context": "Elevate Accounting"},
    {"name": "Danielle Nogueira de Sa", "email": "danielle@daninog.com", "count": 3, "context": "Property acquisition intro"},
    {"name": "Cátia Neves Teixeira", "email": "catianevesteixeira@lawyer.com", "count": 2, "context": "CNT Avocats, property purchase"},
    {"name": "Pedro Octávio de Niemeyer", "email": "pedrooctavio@niemeyer.pt", "count": 2, "context": "Introduction"},
    {"name": "Rebecca Castro", "email": "rebecca@freshpeople.pt", "count": 2, "context": "FreshPeople, late taxes"},
    {"name": "Henrique Faria", "email": "henrique@freshpeople.pt", "count": 5, "context": "FreshPeople, fiscal situation"},
    {"name": "Hadar Steinberg", "email": "hadar@curiousendeavor.com", "count": 6, "context": "Curious Endeavor, invoices"},
    {"name": "Eran Kadosh", "email": "erank@amiryaniv.com", "count": 2, "context": "Geneyx contract"},
    {"name": "Avrom Gilbert", "email": "avrom.gilbert@sparkbeyond.com", "count": 1, "context": "SparkBeyond meeting"},
    {"name": "Dan Peguine", "email": "danpeg@gmail.com", "count": 3, "context": "SparkBeyond workshops"},
    {"name": "Allie Rockwell", "email": "allie.rockwell@boundless.life", "count": 3, "context": "Boundless Life, Japan"},
    {"name": "Ben Lutz", "email": "ben.lutz@boundless.life", "count": 1, "context": "Boundless, Kamakura webinar"},
    {"name": "Michal Hen", "email": "michal@mefathim.co.il", "count": 1, "context": "UI/UX collaboration payment"},
    {"name": "Lolita", "email": "lolita@lolitaandco.com", "count": 4, "context": "Presentation, Anthony meeting"},
    {"name": "Ana Moreira (SOAUTO)", "email": "moreira.ana@soauto.pt", "count": 2, "context": "Car AV-85-HQ"},
    {"name": "Jennifer Schorer", "email": "jennifer@white-space.com", "count": 1, "context": "White Space view request"},
    {"name": "WS Team US", "email": "wsteamus@white-space.com", "count": 2, "context": "White Space marketing"},
    {"name": "Weber Wong", "email": "weber@florafauna.ai", "count": 8, "context": "FLORA AI, image tools"},
    {"name": "Adam Fard", "email": "adam@uxpilot.ai", "count": 5, "context": "UXPilot updates"},
    {"name": "Laurent Goater", "email": "francaisduport@gmail.com", "count": 2, "context": "Conseil Consulaire"},
    {"name": "Raphael Perez", "email": "raphael@israelijazz.com", "count": 2, "context": "Israeli Jazz, Nigun concert"},
    {"name": "Nathalie Coggia", "email": "nathalie.coggia@gmail.com", "count": 2, "context": "French politics, deputy"},
    {"name": "Rob Jones", "email": "rob.jones@boundless.life", "count": 1, "context": "Boundless immigration"},
    {"name": "Geraldine Le Meur", "email": "geraldine@boundless.life", "count": 1, "context": "TLF NYC"},
]

def main():
    print("=== Gmail Contact Processor ===\n")
    
    print("Fetching existing contacts from Notion...")
    existing = get_existing_contacts()
    print(f"Found {len(existing)} existing contacts\n")
    
    # Filter contacts not already in Notion
    new_contacts = []
    for c in CONTACTS:
        if c["email"].lower() not in existing and c["name"].lower() not in existing:
            new_contacts.append(c)
        else:
            print(f"  Skipping (exists): {c['name']}")
    
    print(f"\nNew contacts to add: {len(new_contacts)}")
    
    # Add new contacts to Notion
    added = 0
    for c in new_contacts:
        print(f"  Adding: {c['name']} ({c['email']})")
        success, msg = add_contact_to_notion(c["name"], c["email"], c["count"], c["context"])
        if success:
            added += 1
        else:
            print(f"    Error: {msg[:100]}")
    
    print(f"\n=== Summary ===")
    print(f"Total new contacts added: {added}")
    return added

if __name__ == "__main__":
    added = main()
    print(f"\nDone! Added {added} contacts to Notion Contacts Inbox")
