from typing import List, Dict
from supabase import Client
from .supabase_service import get_supabase

ORG_TABLE = "moef_org"
VIP_TABLE = "moef_vip"

def clear_org(sb: Client | None = None) -> None:
    sb = sb or get_supabase()
    sb.table(ORG_TABLE).delete().neq("id", -1).execute()

def bulk_insert_org(rows: List[Dict], sb: Client | None = None) -> int:
    if not rows:
        return 0
    sb = sb or get_supabase()
    res = sb.table(ORG_TABLE).insert(rows).execute()
    return len(res.data or [])

def clear_vip(sb: Client | None = None) -> None:
    sb = sb or get_supabase()
    sb.table(VIP_TABLE).delete().neq("department", "__never__").execute()

def bulk_insert_vip(rows: List[Dict], sb: Client | None = None) -> int:
    if not rows:
        return 0
    sb = sb or get_supabase()
    res = sb.table(VIP_TABLE).insert(rows).execute()
    return len(res.data or [])

def get_all_departments(sb: Client | None = None) -> List[str]:
    sb = sb or get_supabase()
    res = sb.table(ORG_TABLE).select("department").execute()
    seen, out = set(), []
    for r in (res.data or []):
        d = (r.get("department") or "").strip()
        if d and d not in seen:
            seen.add(d); out.append(d)
    return out

def select_vip_by_department(department: str, positions: List[str], sb: Client | None = None) -> List[Dict]:
    sb = sb or get_supabase()
    q = (sb.table(ORG_TABLE)
           .select("department,name,position,task,phone")
           .eq("department", department)
           .in_("position", positions))
    res = q.execute()
    return res.data or []

# ----- 여기 추가: MOEF 조직도 검색 -----
def search_moef_org(keyword: str, limit: int = 50, sb: Client | None = None) -> List[Dict]:
    """
    이름(name) 또는 부서(department)에 keyword가 포함(ILIKE)된 행을 검색
    """
    if not keyword:
        return []
    sb = sb or get_supabase()
    cond = f"name.ilike.%{keyword}%,department.ilike.%{keyword}%"
    res = (sb.table(ORG_TABLE)
             .select("department,name,position,task,phone")
             .or_(cond)
             .limit(limit)
             .execute())
    return res.data or []
