#!/usr/bin/env python3
"""Find and remove duplicate contacts in Notion People Directory"""

import os
import json
import requests
from collections import defaultdict

NOTION_KEY = open(os.path.expanduser("~/.config/notion/api_key")).read().strip()
PEOPLE_DB = "142acbed-9e19-48e0-911f-2fc6513b564d"

headers = {
    "Authorization": f"Bearer {NOTION_KEY}",
    "Notion-Version": "2022-06-28",
    "Content-Type": "application/json"
}

def get_all_contacts():
    """Fetch all contacts with pagination"""
    contacts = []
    next_cursor = None
    
    while True:
        payload = {"page_size": 100}
        if next_cursor:
            payload["start_cursor"] = next_cursor
            
        resp = requests.post(
            f"https://api.notion.com/v1/databases/{PEOPLE_DB}/query",
            headers=headers,
            json=payload
        )
        data = resp.json()
        
        for result in data.get("results", []):
            try:
                name = result["properties"]["Name"]["title"][0]["plain_text"]
            except (KeyError, IndexError):
                name = "unnamed"
            contacts.append({
                "id": result["id"],
                "name": name.strip().lower()  # Normalize for comparison
            })
        
        if not data.get("has_more"):
            break
        next_cursor = data.get("next_cursor")
        print(f"Fetched {len(contacts)} contacts...")
    
    return contacts

def find_duplicates(contacts):
    """Group contacts by normalized name"""
    by_name = defaultdict(list)
    for c in contacts:
        by_name[c["name"]].append(c["id"])
    
    # Return only names with duplicates
    duplicates = {name: ids for name, ids in by_name.items() if len(ids) > 1}
    return duplicates

def archive_duplicates(duplicates, dry_run=True):
    """Archive duplicate contacts (keep first, archive rest)"""
    archived = 0
    for name, ids in duplicates.items():
        # Keep first, archive rest
        to_archive = ids[1:]
        for page_id in to_archive:
            if dry_run:
                print(f"Would archive: {name} ({page_id})")
            else:
                resp = requests.patch(
                    f"https://api.notion.com/v1/pages/{page_id}",
                    headers=headers,
                    json={"archived": True}
                )
                if resp.status_code == 200:
                    archived += 1
                    if archived % 50 == 0:
                        print(f"Archived {archived} duplicates...")
    return archived

if __name__ == "__main__":
    import sys
    
    print("Fetching all contacts...")
    contacts = get_all_contacts()
    print(f"\nTotal contacts: {len(contacts)}")
    
    print("\nFinding duplicates...")
    duplicates = find_duplicates(contacts)
    
    total_dupes = sum(len(ids) - 1 for ids in duplicates.values())
    print(f"\nFound {len(duplicates)} names with duplicates")
    print(f"Total duplicate entries to remove: {total_dupes}")
    
    # Show top duplicates
    print("\nTop 20 duplicated names:")
    sorted_dupes = sorted(duplicates.items(), key=lambda x: len(x[1]), reverse=True)[:20]
    for name, ids in sorted_dupes:
        print(f"  {len(ids)}x {name}")
    
    # Check for --delete flag
    if len(sys.argv) > 1 and sys.argv[1] == "--delete":
        print("\nArchiving duplicates...")
        archived = archive_duplicates(duplicates, dry_run=False)
        print(f"\n✓ Archived {archived} duplicate contacts")
    else:
        print("\nRun with --delete to archive duplicates")
