#!/usr/bin/env python3
import os
import json
from datetime import datetime
from collections import defaultdict

MAIL_ROOT = os.environ.get("FOXMAIL_MAIL_ROOT", "/root/Foxmail/Mail")

def scan_mail_folder(mail_root):
    if not os.path.exists(mail_root):
        return {"error": f"Path not found: {mail_root}"}
    
    results = {
        "scan_time": datetime.now().isoformat(),
        "mail_root": mail_root,
        "accounts": [],
        "total_size_mb": 0,
        "total_emails": 0,
        "top_senders": [],
    }
    
    sender_count = defaultdict(int)
    
    if not os.path.isdir(mail_root):
        return {"error": f"Not a directory: {mail_root}"}
    
    for account in sorted(os.listdir(mail_root)):
        account_path = os.path.join(mail_root, account)
        if not os.path.isdir(account_path):
            continue
        
        account_info = {"name": account, "folders": [], "email_count": 0, "size_mb": 0}
        
        for root, dirs, files in os.walk(account_path):
            folder_size = 0
            folder_emails = 0
            rel_path = os.path.relpath(root, account_path)
            
            for f in files:
                fp = os.path.join(root, f)
                try:
                    folder_size += os.path.getsize(fp)
                except:
                    pass
                
                if f.endswith((".eml", ".txt")) and os.path.getsize(fp) < 10_000_000:
                    folder_emails += 1
                    results["total_emails"] += 1
                    try:
                        with open(fp, "r", errors="ignore") as eml:
                            content = eml.read(3000)
                            for line in content.split("\n"):
                                if line.startswith("From:"):
                                    sender = line[5:].strip().split("<")[0].strip().strip('"')
                                    if sender:
                                        sender_count[sender] += 1
                    except:
                        pass
            
            if folder_emails > 0:
                folder_size_mb = folder_size / (1024 * 1024)
                account_info["folders"].append({
                    "path": rel_path,
                    "emails": folder_emails,
                    "size_mb": round(folder_size_mb, 2)
                })
                account_info["email_count"] += folder_emails
                account_info["size_mb"] += folder_size_mb
                results["total_size_mb"] += folder_size_mb
        
        if account_info["email_count"] > 0:
            results["accounts"].append(account_info)
    
    results["total_size_mb"] = round(results["total_size_mb"], 2)
    for acc in results["accounts"]:
        acc["size_mb"] = round(acc["size_mb"], 2)
    
    results["top_senders"] = [{"email": e, "count": c} for e, c in sorted(sender_count.items(), key=lambda x: -x[1])[:20]]
    
    return results

if __name__ == "__main__":
    print(f"Scanning: {MAIL_ROOT}")
    r = scan_mail_folder(MAIL_ROOT)
    print(json.dumps(r, indent=2, ensure_ascii=False))