from __future__ import annotations

import re
import uuid
from datetime import datetime
from pathlib import Path
from typing import Optional


def slugify_token(raw: str, *, default: str = "na", max_len: int = 32) -> str:
    token = str(raw or "").strip()
    if not token:
        return default
    token = token.replace("/", "_").replace("\\", "_")
    token = re.sub(r"[^\w가-힣-]+", "_", token, flags=re.UNICODE)
    token = re.sub(r"_+", "_", token).strip("_-")
    if not token:
        return default
    if len(token) > max_len:
        token = token[:max_len].rstrip("_-")
    return token or default


def short_suffix() -> str:
    return uuid.uuid4().hex[:6]


def infer_run_slug_from_input_dir(input_dir: Path) -> str:
    run_dir = input_dir.parent.parent if input_dir.name == "event_info" else input_dir.parent
    return slugify_token(run_dir.name, default="event_info_run", max_len=40)


def build_output_dir_name(
    *,
    input_dir: Path,
    cctv_no: str,
    output_name: Optional[str] = None,
    now: Optional[datetime] = None,
) -> str:
    if output_name:
        return slugify_token(output_name, default="manual_output", max_len=80)
    current = now or datetime.now()
    timestamp = current.strftime("%Y%m%d_%H%M%S")
    run_slug = infer_run_slug_from_input_dir(input_dir)
    cctv_slug = f"cctv{slugify_token(cctv_no or 'na', default='na', max_len=8)}"
    return f"{timestamp}__{run_slug}__{cctv_slug}__u{short_suffix()}"


def build_image_filename(event_no: str, event_type: str, event_timestamp: str, ext: str) -> str:
    event_no_token = slugify_token(event_no, default="00000000", max_len=16)
    event_type_token = slugify_token(event_type, default="unknown", max_len=24)
    timestamp_token = slugify_token(event_timestamp, default="no_ts", max_len=24)
    return f"EVENT_INFO_{event_no_token}__{event_type_token}__{timestamp_token}{ext}"
