# 최소 동작용 announce_service
# 봇이 import할 함수 시그니처만 맞춰서 제공합니다.
# 현재는 별도 공지 소스와 연동하지 않고 no-op에 가깝게 동작합니다.

from typing import Any, Dict, List, Optional, Tuple
from datetime import datetime, timedelta, timezone
from app.services.supabase_service import get_client
from .telegram_sender import broadcast_html

def get_cursor(source: str) -> Optional[str]:
    """
    공지 수집용 커서(최신 시각 등)를 가져옵니다.
    현재는 저장소 연동 전이므로 None 반환.
    """
    return None

def set_cursor(source: str, cursor: str) -> None:
    """
    공지 수집 후 최신 커서를 저장합니다.
    현재는 저장소 연동 전이므로 no-op.
    """
    return None

def get_recent_gov_announcements(since: Optional[str] = None, limit: int = 10) -> List[Dict[str, Any]]:
    """
    정부 공지(인사발령 등)를 최근 것부터 반환합니다.
    현재는 외부 소스 연동 전이라 빈 리스트 반환.
    """
    return []

def format_announcement(row: Dict[str, Any]) -> str:
    """
    텔레그램 발송용 텍스트로 포맷합니다.
    최소 형태로 구성.
    """
    title = row.get("title") or "제목 없음"
    url = row.get("url") or ""
    date = row.get("date") or ""
    base = f"정부 인사발령 안내\n제목: {title}\n게시일: {date}".strip()
    if url:
        base += f"\n{url}"
    return base

def summarize_result(rows: List[Dict[str, Any]]) -> Tuple[str, Optional[str]]:
    """
    발송 요약과 커서용 최종 타임스탬프(또는 ID)를 돌려줍니다.
    현재는 rows 비어있다고 가정.
    """
    count = len(rows)
    last_ts = None
    return (f"총 {count}건 처리", last_ts)


# --------- Daily Digest ---------
def _korea_today_range() -> Tuple[str, str]:
    kst = timezone(timedelta(hours=9))
    now = datetime.now(kst)
    start = now.replace(hour=0, minute=0, second=0, microsecond=0)
    end = start + timedelta(days=1)
    return (start.astimezone(timezone.utc).isoformat(), end.astimezone(timezone.utc).isoformat())

def _fetch_recent(sb, table: str, ts_field: str = "posted_at", limit: int = 20) -> List[Dict[str, Any]]:
    try:
        start_iso, end_iso = _korea_today_range()
        q = (sb.table(table)
               .select("*")
               .gte(ts_field, start_iso)
               .lt(ts_field, end_iso)
               .order(ts_field, desc=True)
               .limit(limit))
        return q.execute().data or []
    except Exception:
        return []

def build_daily_digest() -> Optional[str]:
    sb = get_client()
    moef = _fetch_recent(sb, "moef_id")
    motie = _fetch_recent(sb, "motie_id")
    me = _fetch_recent(sb, "me_id")
    kepco = _fetch_recent(sb, "kepco_id", ts_field="created_at")

    total = len(moef) + len(motie) + len(me) + len(kepco)
    if total == 0:
        return None

    def lines_for(title: str, rows: List[Dict[str, Any]], url_key: str = "url", title_key: str = "title", max_items: int = 5) -> List[str]:
        out = [f"<b>{title}</b> ({len(rows)}건)"] if rows else []
        for r in rows[:max_items]:
            t = (r.get(title_key) or "-").strip()
            u = r.get(url_key)
            if u:
                out.append(f"· <a href=\"{u}\">{t}</a>")
            else:
                out.append(f"· {t}")
        return out

    parts: List[str] = ["📊 일일 요약 (정부/ALIO)"]
    parts += lines_for("기재부 인사", moef)
    parts += lines_for("산업부 인사", motie)
    parts += lines_for("환경부 인사", me)
    parts += lines_for("전력그룹사 공시", kepco, url_key="pdf_url", title_key="department")

    return "\n".join(parts)

def send_daily_digest() -> int:
    msg = build_daily_digest()
    if not msg:
        return 0
    try:
        return int(broadcast_html(msg))
    except Exception:
        return 0
