import csv
import json
import sys
from pathlib import Path

VAULT_DIR = Path(__file__).parent / "vault"
OUTPUT = Path(__file__).parent / "data" / "vault_creds.csv"


def parse_dump_path(json_path: Path) -> tuple:
    rel = json_path.relative_to(VAULT_DIR)
    parts = rel.parts
    dump_id = parts[0]
    browser_profile = parts[2] if len(parts) > 2 else "unknown"
    return dump_id, browser_profile


def main():
    rows = []
    errors = []

    json_files = sorted(VAULT_DIR.rglob("passwords.json"))
    print(f"[*] Найдено {len(json_files)} passwords.json", file=sys.stderr)

    for jf in json_files:
        dump_id, browser = parse_dump_path(jf)
        try:
            with open(jf, "r", encoding="utf-8", errors="replace") as f:
                data = json.load(f)
        except (json.JSONDecodeError, UnicodeDecodeError) as e:
            errors.append((str(jf), str(e)))
            continue

        if not isinstance(data, list):
            errors.append((str(jf), "not a JSON array"))
            continue

        for entry in data:
            url = entry.get("origin_url", "").strip()
            user = entry.get("username", "").strip()
            pwd = entry.get("password", "").strip()
            if not url and not user and not pwd:
                continue
            rows.append({
                "dump_id": dump_id,
                "browser": browser,
                "url": url,
                "username": user,
                "password": pwd,
            })

    rows.sort(key=lambda r: (r["dump_id"], r["browser"], r["url"]))

    with open(OUTPUT, "w", newline="", encoding="utf-8") as f:
        writer = csv.DictWriter(f, fieldnames=["dump_id", "browser", "url", "username", "password"])
        writer.writeheader()
        writer.writerows(rows)

    unique_creds = len({(r["url"], r["username"], r["password"]) for r in rows})
    unique_domains = len({r["url"].split("/")[2] if "://" in r["url"] else r["url"] for r in rows if r["url"]})
    dumps_with_creds = len({r["dump_id"] for r in rows})

    print(f"[+] Всего записей: {len(rows)}", file=sys.stderr)
    print(f"[+] Уникальных кредов (url+user+pass): {unique_creds}", file=sys.stderr)
    print(f"[+] Уникальных доменов: {unique_domains}", file=sys.stderr)
    print(f"[+] Дампов с кредами: {dumps_with_creds}", file=sys.stderr)
    print(f"[+] Ошибок парсинга: {len(errors)}", file=sys.stderr)
    print(f"[=] Сохранено: {OUTPUT}", file=sys.stderr)

    if errors:
        print(f"\n[!] Ошибки:", file=sys.stderr)
        for path, err in errors:
            print(f"    {path}: {err}", file=sys.stderr)


if __name__ == "__main__":
    main()
