from __future__ import annotations

import json
from dataclasses import dataclass
from pathlib import Path
from typing import Any, Dict, Iterable, List


@dataclass
class EventInfoRecord:
    path: Path
    payload: Dict[str, Any]

    @property
    def event_no(self) -> str:
        return str(self.payload.get("event_No") or "").strip()

    @property
    def event_type(self) -> str:
        return str(self.payload.get("event_type") or "").strip()

    @property
    def event_timestamp(self) -> str:
        return str(self.payload.get("event_timestamp") or "").strip()

    @property
    def cctv_no(self) -> str:
        return str(self.payload.get("cctv_No") or "").strip()

    @property
    def has_base64(self) -> bool:
        return bool(str(self.payload.get("event_image") or "").strip())


def scan_event_info_dir(input_dir: Path) -> List[EventInfoRecord]:
    if not input_dir.exists():
        raise FileNotFoundError(f"Input dir not found: {input_dir}")
    if not input_dir.is_dir():
        raise NotADirectoryError(f"Input path is not a directory: {input_dir}")

    records: List[EventInfoRecord] = []
    for path in sorted(input_dir.glob("EVENT_INFO_*.json")):
        payload = json.loads(path.read_text(encoding="utf-8"))
        if not isinstance(payload, dict):
            raise ValueError(f"Expected JSON object in {path}, got {type(payload).__name__}")
        records.append(EventInfoRecord(path=path, payload=payload))
    return records


def summarize_event_types(records: Iterable[EventInfoRecord]) -> Dict[str, int]:
    counts: Dict[str, int] = {}
    for record in records:
        key = record.event_type or "unknown"
        counts[key] = counts.get(key, 0) + 1
    return counts
