import os
import logging
from dotenv import load_dotenv
from supabase import create_client, Client

load_dotenv()

SUPABASE_URL = os.getenv("SUPABASE_URL")
SUPABASE_KEY = os.getenv("SUPABASE_KEY")  # anon 또는 service 가능
SUPABASE_SECRET = os.getenv("SUPABASE_SECRET")  # service role key (있으면 admin 용도로 사용)
SUPABASE_ADMIN_EMAILS = os.getenv("SUPABASE_ADMIN_EMAILS", "")
LOG_UNITS = os.getenv("LOG_UNITS", "")  # comma-separated systemd units
APP_LOG_PATH = os.getenv("APP_LOG_PATH", "")  # optional app log file to tail
LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO").upper()

logging.basicConfig(level=LOG_LEVEL, format="[%(levelname)s] %(message)s")
logger = logging.getLogger("supabase_service")

_client: Client | None = None
_admin_client: Client | None = None

def get_client() -> Client:
    global _client
    if _client is not None:
        return _client
    if not SUPABASE_URL or not SUPABASE_KEY:
        raise RuntimeError("SUPABASE_URL 또는 SUPABASE_KEY 환경변수가 비어있습니다.")
    try:
        _client = create_client(SUPABASE_URL, SUPABASE_KEY)
        return _client
    except Exception as e:
        logger.error("Supabase 클라이언트 생성 실패: %s", e)
        raise


def get_admin_client() -> Client:
    """Service role key 기반 관리자 클라이언트. 비어있으면 기본 키로 폴백."""
    global _admin_client
    if _admin_client is not None:
        return _admin_client
    if not SUPABASE_URL:
        raise RuntimeError("SUPABASE_URL 환경변수가 비어있습니다.")
    key = SUPABASE_SECRET or SUPABASE_KEY
    if not key:
        raise RuntimeError("SUPABASE_SECRET 또는 SUPABASE_KEY 중 하나가 필요합니다.")
    try:
        _admin_client = create_client(SUPABASE_URL, key)
        return _admin_client
    except Exception as e:
        logger.error("Supabase 관리자 클라이언트 생성 실패: %s", e)
        raise


def get_admin_emails() -> set[str]:
    """관리자 이메일 목록을 .env에서 읽어 소문자로 정규화해 반환.
    예) SUPABASE_ADMIN_EMAILS="admin@example.com, jhlee@kps.co.kr"
    기본값으로 jhlee@kps.co.kr 포함.
    """
    base = {"jhlee@kps.co.kr"}
    raw = (SUPABASE_ADMIN_EMAILS or "").strip()
    if not raw:
        return base
    parts = [p.strip().lower() for p in raw.split(',') if p.strip()]
    return set(parts) or base


def get_log_units() -> set[str]:
    base = {"govbot-web.service"}
    raw = (LOG_UNITS or "").strip()
    if not raw:
        return base
    parts = [p.strip() for p in raw.split(',') if p.strip()]
    return set(parts) or base


def get_app_log_path() -> str | None:
    p = (APP_LOG_PATH or "").strip()
    return p or None
