#!/usr/bin/env python3
"""Print a structured summary of an exported case.

Reads manifest.json and case.json from an exported case directory and outputs
key metadata in a format useful for diagnosis workflows.

Usage:
    ./case-summary CASE_DIR

    CASE_DIR  Path to exported case directory (e.g. ./processed_cases/CASE_ID/)

Output includes:
    - Case ID and short ID
    - Case name (with parsed event timestamp if present)
    - Farm / Shed (inferred from case name or DACS files)
    - Recording time window
    - Data source UUIDs
    - Downloaded data files
    - State and workflow info
"""
import json
import re
import sys
from datetime import datetime, timezone
from pathlib import Path


def parse_event_time_from_name(name: str):
    """Try to extract event timestamp from case name like chicken_welfare_case_20260504_233251_..."""
    m = re.search(r"(\d{8})_(\d{6})", name)
    if m:
        try:
            dt = datetime.strptime(m.group(1) + m.group(2), "%Y%m%d%H%M%S")
            return dt.replace(tzinfo=timezone.utc).isoformat()
        except ValueError:
            pass
    return None


def parse_entity_id_from_name(name: str):
    """Try to extract entity UUID from case name."""
    m = re.search(r"([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})", name)
    return m.group(1) if m else None


def find_dacs_files(case_dir: Path):
    """Find DACS JSON files (pattern: datetime-to-datetime.json)."""
    return [f.name for f in case_dir.glob("*-to-*.json")]


def main():
    if len(sys.argv) < 2 or sys.argv[1] in ("-h", "--help"):
        print(__doc__.strip())
        sys.exit(0)

    case_dir = Path(sys.argv[1])
    if not case_dir.is_dir():
        print(f"Error: {case_dir} is not a directory", file=sys.stderr)
        sys.exit(1)

    manifest_path = case_dir / "manifest.json"
    case_path = case_dir / "case.json"

    if not manifest_path.exists():
        print(f"Error: manifest.json not found in {case_dir}", file=sys.stderr)
        sys.exit(1)

    with open(manifest_path) as f:
        manifest = json.load(f)

    case_data = {}
    if case_path.exists():
        with open(case_path) as f:
            case_data = json.load(f)

    case_name = case_data.get("name", "N/A")
    event_time = parse_event_time_from_name(case_name)
    entity_id = parse_entity_id_from_name(case_name)
    dacs_files = find_dacs_files(case_dir)

    print("=" * 60)
    print("CASE SUMMARY")
    print("=" * 60)
    print()
    print(f"  Case ID:          {manifest.get('caseId', 'N/A')}")
    print(f"  Short ID:         {case_data.get('shortId', 'N/A')}")
    print(f"  Case Name:        {case_name}")
    print(f"  State:            {case_data.get('state', 'N/A')}")
    print()
    print(f"  Event Time (parsed from name): {event_time or 'N/A'}")
    print(f"  Entity ID (parsed from name):  {entity_id or 'N/A'}")
    print()
    print("--- Time Window ---")
    print(f"  Recorded start:   {manifest.get('recorded_at_start', 'N/A')}")
    print(f"  Recorded end:     {manifest.get('recorded_at_end', 'N/A')}")
    print(f"  Window from:      {manifest.get('window_recorded_from', 'N/A')}")
    print(f"  Window to:        {manifest.get('window_recorded_to', 'N/A')}")
    print(f"  Exported at:      {manifest.get('exportedAt', 'N/A')}")
    print()
    print("--- Data Sources ---")
    ds_uuids = manifest.get("dataSourceUuids", [])
    for uuid in ds_uuids:
        print(f"  - {uuid}")
    if not ds_uuids:
        print("  (none)")
    print()
    print("--- Downloaded Data Files ---")
    downloaded = manifest.get("downloadedFiles", {})
    print(f"  Count: {manifest.get('dataFileCount', len(downloaded))}")
    for file_id, path in downloaded.items():
        print(f"  - [{file_id}] {path}")
    if not downloaded:
        print("  (none)")
    print()
    print("--- DACS Telemetry Files ---")
    if dacs_files:
        for f in dacs_files:
            print(f"  - {f}")
    else:
        print("  (none found)")
    print()
    print("--- Workflow ---")
    print(f"  Workflow:          {case_data.get('workflowName', 'N/A')}")
    print(f"  Workflow Order:    {case_data.get('workflowOrderName', 'N/A')}")
    print(f"  Messages:         {manifest.get('messageCount', 'N/A')}")
    print()

    # Check for flattened eavts
    eavts_path = case_dir / "data_files" / "eavts_flat.json"
    if eavts_path.exists():
        size_mb = eavts_path.stat().st_size / (1024 * 1024)
        print(f"--- Flattened EAVT Data ---")
        print(f"  Path: {eavts_path.relative_to(case_dir)}")
        print(f"  Size: {size_mb:.1f} MB")
        print()

    print("=" * 60)


if __name__ == "__main__":
    main()
