# -*- coding: utf-8 -*-
"""
STEP104-15 V2 Editor Ready

역할:
- 네이버 블로그 글쓰기 이동 후 에디터가 실제로 준비되었는지 확인한다.
- page.frames를 순회하여 에디터 frame을 찾는다.
- 제목/본문 placeholder 또는 se-body 존재 여부를 확인한다.

V1 publish_worker.py는 수정하지 않는다.
"""


class V2EditorReady:
    def __init__(self, verbose=True):
        self.verbose = verbose

    def wait_ready(self, page, logger=None, session=None, timeout_seconds=30):
        def _run():
            return self._wait_ready_impl(page, timeout_seconds=timeout_seconds)

        if session and logger:
            with session.step("editor.ready", logger=logger):
                return _run()

        return _run()

    def _wait_ready_impl(self, page, timeout_seconds=30):
        last_frames = []

        for sec in range(int(timeout_seconds)):
            try:
                page.wait_for_timeout(1000)
            except Exception:
                pass

            frames = page.frames
            last_frames = [
                {
                    "name": f.name,
                    "url": f.url,
                }
                for f in frames
            ]

            if self.verbose:
                print(f"[V2 EDITOR READY WAIT] {sec + 1}/{timeout_seconds} frames={len(frames)}")

            # 1) page 자체 검사
            if self._is_editor_ready_target(page, "page"):
                return {
                    "ready": True,
                    "target_type": "page",
                    "frame": None,
                    "frames": last_frames,
                }

            # 2) frame 검사
            for frame in frames:
                try:
                    if self._is_editor_ready_target(frame, f"frame:{frame.name}"):
                        return {
                            "ready": True,
                            "target_type": "frame",
                            "frame": frame,
                            "frame_name": frame.name,
                            "frame_url": frame.url,
                            "frames": last_frames,
                        }
                except Exception:
                    pass

        return {
            "ready": False,
            "target_type": None,
            "frame": None,
            "frames": last_frames,
        }

    def _is_editor_ready_target(self, target, target_name):
        checks = [
            ".blog_editor",
            ".se-body",
            ".se-documentTitle",
            ".se-section-documentTitle",
            ".se-placeholder",
            "span.se-placeholder:has-text('제목')",
            "article.se-components-wrap",
        ]

        hit = 0

        for selector in checks:
            try:
                count = target.locator(selector).count()
                if count > 0:
                    hit += 1
                    if self.verbose:
                        print("[V2 EDITOR READY HIT]", target_name, selector, count)
            except Exception:
                pass

        # se-body 또는 제목/본문 관련 selector 1개 이상이면 준비 상태로 본다.
        return hit > 0


def wait_editor_ready(page, logger=None, session=None, timeout_seconds=30, verbose=True):
    ready = V2EditorReady(verbose=verbose)
    return ready.wait_ready(
        page=page,
        logger=logger,
        session=session,
        timeout_seconds=timeout_seconds,
    )
