#!/usr/bin/env python3
"""
Desktop Inspo Folder Scanner
Scans ~/Desktop/inspo and outputs structured JSON for Notion import.
No hallucination - just reads files.
"""

import os
import json
import plistlib
from pathlib import Path
from datetime import datetime

INSPO_DIR = Path.home() / "Desktop" / "inspo"
OUTPUT_FILE = Path.home() / "Desktop" / "inspo_scan_results.json"

def extract_webloc_url(filepath):
    """Extract URL from .webloc file (XML plist format)."""
    try:
        with open(filepath, 'rb') as f:
            plist = plistlib.load(f)
            return plist.get('URL', None)
    except Exception as e:
        return None

def scan_folder(base_dir):
    """Recursively scan folder and categorize files."""
    results = {
        "metadata": {
            "scan_date": datetime.now().isoformat(),
            "source_dir": str(base_dir),
            "counts": {"weblocs": 0, "images": 0, "pdfs": 0, "html": 0, "other": 0}
        },
        "weblocs": [],
        "images": [],
        "pdfs": [],
        "html_files": [],
        "other": []
    }
    
    image_exts = {'.jpg', '.jpeg', '.png', '.gif', '.webp', '.bmp', '.tiff'}
    
    for root, dirs, files in os.walk(base_dir):
        # Skip asset folders (like "Any Studios_files")
        dirs[:] = [d for d in dirs if not d.endswith('_files')]
        
        rel_folder = os.path.relpath(root, base_dir)
        if rel_folder == '.':
            rel_folder = 'root'
        
        for filename in files:
            if filename.startswith('.'):
                continue
                
            filepath = os.path.join(root, filename)
            ext = os.path.splitext(filename)[1].lower()
            filesize = os.path.getsize(filepath)
            
            item = {
                "filename": filename,
                "path": filepath,
                "folder": rel_folder,
                "size_bytes": filesize
            }
            
            if ext == '.webloc':
                url = extract_webloc_url(filepath)
                item["url"] = url
                item["title"] = os.path.splitext(filename)[0]
                results["weblocs"].append(item)
                results["metadata"]["counts"]["weblocs"] += 1
                
            elif ext in image_exts:
                item["type"] = ext[1:]  # Remove the dot
                results["images"].append(item)
                results["metadata"]["counts"]["images"] += 1
                
            elif ext == '.pdf':
                item["size_mb"] = round(filesize / (1024 * 1024), 2)
                results["pdfs"].append(item)
                results["metadata"]["counts"]["pdfs"] += 1
                
            elif ext in {'.html', '.htm'}:
                results["html_files"].append(item)
                results["metadata"]["counts"]["html"] += 1
                
            else:
                results["other"].append(item)
                results["metadata"]["counts"]["other"] += 1
    
    # Calculate total
    counts = results["metadata"]["counts"]
    results["metadata"]["total_items"] = sum(counts.values())
    
    return results

def main():
    if not INSPO_DIR.exists():
        print(f"Error: {INSPO_DIR} does not exist")
        return 1
    
    print(f"Scanning {INSPO_DIR}...")
    results = scan_folder(INSPO_DIR)
    
    with open(OUTPUT_FILE, 'w') as f:
        json.dump(results, f, indent=2)
    
    print(f"\nScan complete!")
    print(f"  Weblocs: {results['metadata']['counts']['weblocs']}")
    print(f"  Images:  {results['metadata']['counts']['images']}")
    print(f"  PDFs:    {results['metadata']['counts']['pdfs']}")
    print(f"  HTML:    {results['metadata']['counts']['html']}")
    print(f"  Other:   {results['metadata']['counts']['other']}")
    print(f"  TOTAL:   {results['metadata']['total_items']}")
    print(f"\nResults saved to: {OUTPUT_FILE}")
    return 0

if __name__ == "__main__":
    exit(main())
