#!/usr/bin/env python3
"""Crea un inventario non distruttivo da conversations.json di ChatGPT."""

from __future__ import annotations

import argparse
import csv
import hashlib
import json
from collections import Counter
from datetime import datetime, timezone
from pathlib import Path
from typing import Any


def short_hash(value: str) -> str:
    return hashlib.sha256(value.encode("utf-8", errors="replace")).hexdigest()[:16]


def year_from_timestamp(value: Any) -> str:
    try:
        return str(datetime.fromtimestamp(float(value), tz=timezone.utc).year)
    except (TypeError, ValueError, OSError):
        return "sconosciuto"


def conversation_rows(data: Any, include_titles: bool = False) -> list[dict[str, str | int]]:
    if not isinstance(data, list):
        raise ValueError("Il file deve contenere un elenco di conversazioni.")
    rows: list[dict[str, str | int]] = []
    for index, item in enumerate(data):
        if not isinstance(item, dict):
            continue
        title = str(item.get("title") or "")
        conversation_id = str(item.get("conversation_id") or item.get("id") or index)
        mapping = item.get("mapping")
        row: dict[str, str | int] = {
            "conversation_hash": short_hash(conversation_id),
            "year": year_from_timestamp(item.get("create_time")),
            "title_length": len(title),
            "message_nodes": len(mapping) if isinstance(mapping, dict) else 0,
            "review_status": "DA VALUTARE",
        }
        if include_titles:
            row["title"] = title
        rows.append(row)
    return rows


def main() -> int:
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("source", type=Path, help="File conversations.json locale")
    parser.add_argument("--output-dir", type=Path, required=True, help="Cartella per i report")
    parser.add_argument("--include-titles", action="store_true", help="Include titoli: controllare prima di condividere")
    args = parser.parse_args()
    with args.source.open(encoding="utf-8") as handle:
        data = json.load(handle)
    rows = conversation_rows(data, args.include_titles)
    args.output_dir.mkdir(parents=True, exist_ok=True)
    fieldnames = ["conversation_hash", "year", "title_length", "message_nodes", "review_status"]
    if args.include_titles:
        fieldnames.append("title")
    with (args.output_dir / "chat-inventory.csv").open("w", newline="", encoding="utf-8") as handle:
        writer = csv.DictWriter(handle, fieldnames=fieldnames)
        writer.writeheader()
        writer.writerows(rows)
    years = Counter(str(row["year"]) for row in rows)
    with (args.output_dir / "summary.md").open("w", encoding="utf-8") as handle:
        handle.write("# Inventario ChatGPT\n\n")
        handle.write(f"Conversazioni rilevate: {len(rows)}\n\n")
        handle.write("Nessuna chat è stata spostata, rinominata o cancellata.\n\n")
        handle.write("## Per anno\n\n")
        for year, count in sorted(years.items()):
            handle.write(f"- {year}: {count}\n")
    print(f"Inventariate {len(rows)} conversazioni in {args.output_dir}")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
