# -*- coding: utf-8 -*-
"""
V2-020 SessionAdapter - Auto Relogin Gate, blog_naver_sessions schema compatible

역할:
- 기존 workers.naver_session_check_worker.run() 호출
- 세션 만료 시 auto_relogin_enabled=True로 복구 시도
- blog_naver_sessions.session_status 기준으로 최종 상태 판정
- linked/login_ok 상태면 다음 Stage 진행
- 복구 실패 상태면 Pipeline 중단
"""

from services.v2.base_adapter import BaseAdapter


class SessionAdapter(BaseAdapter):
    name = "session_adapter"

    OK_STATUSES = {
        "login_ok",
        "linked",
    }

    def run(self, context) -> dict:
        return self.check(context)

    def check(self, context) -> dict:
        try:
            from workers.naver_session_check_worker import run as run_session_check

            worker_result = run_session_check(
                limit=1,
                realtor_id=context.realtor_id,
                headless=True,
                auto_relogin_enabled=True,
                write_check=True,
                only_enabled=False,
                sleep_seconds=0,
            )

            session_row = self.fetch_session_row(context.realtor_id)

            status = str(
                (session_row or {}).get("session_status")
                or (session_row or {}).get("status")
                or ""
            ).strip()

            message = str(
                (session_row or {}).get("last_error_message")
                or (session_row or {}).get("message")
                or ""
            ).strip()

            data = {
                "realtor_id": context.realtor_id,
                "worker_result": worker_result,
                "session_row": session_row,
                "status": status,
                "message": message,
                "auto_relogin_enabled": True,
            }

            if status in self.OK_STATUSES:
                return self.ok(
                    message=f"session ok after check/relogin: {status}",
                    data=data,
                    status=status,
                )

            return self.fail(
                message=f"session not ok after relogin: {status or 'unknown'} / {message}",
                data=data,
                status=status or "unknown",
            )

        except Exception as e:
            return self.fail(
                message=f"session worker failed: {e}",
                data={
                    "realtor_id": context.realtor_id,
                    "error": str(e),
                    "auto_relogin_enabled": True,
                },
                status="check_failed",
            )

    def fetch_session_row(self, realtor_id: int):
        """
        운영 DB 스키마 차이를 흡수한다.
        현재 확인된 컬럼:
        - session_status
        - session_data
        - issued_at
        - last_verified_at
        """
        try:
            from db import get_conn

            conn = get_conn()
            try:
                with conn.cursor() as cur:
                    cur.execute("SHOW COLUMNS FROM blog_naver_sessions")
                    column_rows = cur.fetchall() or []

                    columns = []
                    for row in column_rows:
                        if isinstance(row, dict):
                            columns.append(str(row.get("Field") or ""))
                        else:
                            columns.append(str(row[0] or ""))

                    wanted = [
                        "id",
                        "realtor_id",
                        "naver_id",
                        "naver_name",
                        "session_status",
                        "status",
                        "session_data",
                        "session_token",
                        "issued_at",
                        "expired_at",
                        "last_verified_at",
                        "last_checked_at",
                        "last_login_ok_at",
                        "fail_count",
                        "updated_at",
                        "created_at",
                    ]

                    existing = [c for c in wanted if c in columns]

                    if not existing:
                        return {
                            "realtor_id": realtor_id,
                            "session_status": "check_failed",
                            "last_error_message": "blog_naver_sessions columns not found",
                        }

                    sql = f"""
                        SELECT {', '.join(existing)}
                        FROM blog_naver_sessions
                        WHERE realtor_id=%s
                        ORDER BY id DESC
                        LIMIT 1
                    """
                    cur.execute(sql, (int(realtor_id),))
                    row = cur.fetchone()

                return dict(row) if row else {
                    "realtor_id": realtor_id,
                    "session_status": "unknown",
                    "last_error_message": "session row not found",
                }

            finally:
                conn.close()

        except Exception as e:
            return {
                "realtor_id": realtor_id,
                "session_status": "check_failed",
                "last_error_message": f"fetch_session_row failed: {e}",
            }
