from datetime import date
from flask import Blueprint, render_template, request
from app.services.db import get_supabase

web_bp = Blueprint("web", __name__)

# ====== 테이블명만 여기서 맞춰 주세요 ======
TABLE_STAFF = "gov_staff"           # 직원/전화록
TABLE_TIMELINE = "gov_personnel"    # 인사동정 타임라인
PAGE_SIZE = 50

def _parse_int(v, default):
    try:
        return int(v)
    except Exception:
        return default

# --- 대정부 직원 검색 ---
@web_bp.route("/gov/search")
def gov_search():
    src = (request.args.get("src") or "all").upper()
    q   = (request.args.get("q") or "").strip()
    page = _parse_int(request.args.get("page"), 1)
    page = 1 if page < 1 else page

    sb = get_supabase()
    if sb is None:
        return render_template(
            "gov_search.html",
            src=src, q=q, rows=[],
            page=page, has_more=False,
            error="환경변수가 비어 있어 Supabase에 연결할 수 없습니다. (.env 로드/Apache 환경 확인)"
        )

    start = (page - 1) * PAGE_SIZE
    end   = start + PAGE_SIZE - 1

    # 기본 쿼리
    query = sb.table(TABLE_STAFF).select("*", count="exact")

    # 기관 필터
    if src != "ALL":
        query = query.eq("source", src)

    # 검색어(이름/부서/직위/업무) ILIKE
    if q:
        # Supabase-Python: .or_("col.ilike.%...%,col2.ilike.%...%")
        like = f"%{q}%"
        query = query.or_(
            "name.ilike.{0},department.ilike.{0},position.ilike.{0},task.ilike.{0}".format(like)
        )

    # 정렬 + 페이지네이션
    query = query.order("source").order("department").order("name").range(start, end)

    try:
        resp = query.execute()
        rows = resp.data or []
        total = resp.count or 0
        has_more = end + 1 < total
    except Exception as e:
        rows, has_more = [], False
        return render_template(
            "gov_search.html",
            src=src, q=q, rows=rows, page=page, has_more=has_more,
            error=f"검색 중 오류가 발생했습니다: {e}"
        )

    return render_template(
        "gov_search.html",
        src=src, q=q, rows=rows, page=page, has_more=has_more
    )

# --- 대정부 인사동정 (타임라인) ---
@web_bp.route("/gov/personnel")
def gov_personnel():
    src   = (request.args.get("src") or "all").upper()
    q     = (request.args.get("q") or "").strip()
    start = (request.args.get("start") or "").strip()
    end   = (request.args.get("end") or "").strip()
    page  = _parse_int(request.args.get("page"), 1)
    page  = 1 if page < 1 else page

    sb = get_supabase()
    if sb is None:
        return render_template(
            "gov_personnel.html",
            src=src, q=q, start=start, end=end,
            rows=[], page=page, has_more=False,
            error="환경변수가 비어 있어 Supabase에 연결할 수 없습니다. (.env 로드/Apache 환경 확인)"
        )

    r0 = (page - 1) * PAGE_SIZE
    r1 = r0 + PAGE_SIZE - 1

    query = sb.table(TABLE_TIMELINE).select("*", count="exact")

    if src != "ALL":
        query = query.eq("source", src)

    if q:
        like = f"%{q}%"
        query = query.or_(
            "title.ilike.{0},tag.ilike.{0}".format(like)
        )

    # 날짜 필터: posted_at 우선, 없으면 created_at
    # (DB에 posted_at이 항상 있다면 created_at 조건은 빼도 됨)
    if start:
        # (posted_at >= start) OR (created_at >= start)
        query = query.or_(f"posted_at.gte.{start},created_at.gte.{start}")
    if end:
        # (posted_at <= end) OR (created_at <= end)
        query = query.or_(f"posted_at.lte.{end},created_at.lte.{end}")

    # 최신순 정렬 + 페이지네이션
    query = query.order("posted_at", desc=True).order("created_at", desc=True).range(r0, r1)

    try:
        resp = query.execute()
        rows = resp.data or []
        total = resp.count or 0
        has_more = r1 + 1 < total
    except Exception as e:
        rows, has_more = [], False
        return render_template(
            "gov_personnel.html",
            src=src, q=q, start=start, end=end,
            rows=rows, page=page, has_more=has_more,
            error=f"조회 중 오류가 발생했습니다: {e}"
        )

    # 템플릿에서 날짜 표시 편의를 위해 문자열화는 Jinja에서 처리
    return render_template(
        "gov_personnel.html",
        src=src, q=q, start=start, end=end,
        rows=rows, page=page, has_more=has_more
    )
