# -*- coding: utf-8 -*-
"""
STEP105-01 V2 Title Input

역할:
- V2 전용 제목 입력 모듈.
- V1 publish_worker.py를 수정하지 않는다.
- Editor Ready에서 확보한 write_frame을 대상으로 제목을 입력한다.

정책:
- 제목 placeholder 또는 documentTitle 영역을 우선 클릭한다.
- keyboard.type으로 사람 입력에 가까운 방식 사용.
- 입력 후 제목 텍스트가 들어갔는지 확인한다.
"""


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

    def input_title(self, page, write_frame, title, logger=None, session=None):
        def _run():
            return self._input_title_impl(page, write_frame, title)

        if session and logger:
            with session.step(
                "title.input",
                logger=logger,
                meta={
                    "title_len": len(str(title or "")),
                },
            ):
                return _run()

        return _run()

    def _input_title_impl(self, page, write_frame, title):
        title = str(title or "").strip()

        if not title:
            raise ValueError("제목이 비어 있습니다.")

        print("[V2 TITLE INPUT START]", title)

        selectors = [
            ".se-section-documentTitle .se-placeholder",
            ".se-documentTitle .se-placeholder",
            ".se-section-documentTitle",
            ".se-documentTitle",
        ]

        clicked = False
        last_error = None

        for selector in selectors:
            try:
                locator = write_frame.locator(selector)

                if locator.count() <= 0:
                    continue

                target = locator.first
                target.click(force=True, timeout=5000)
                page.wait_for_timeout(500)

                clicked = True
                print("[V2 TITLE CLICK]", selector)
                break

            except Exception as e:
                last_error = e
                print("[V2 TITLE CLICK FAIL]", selector, str(e))

        if not clicked:
            raise RuntimeError(f"제목 영역 클릭 실패: {last_error}")

        # 기존 성공 방식에 가깝게 keyboard.type 사용
        page.keyboard.type(title, delay=35)
        page.wait_for_timeout(800)

        ok, current_text = self.verify_title(write_frame, title)

        print("[V2 TITLE VERIFY]", ok, current_text)

        if not ok:
            raise RuntimeError(f"제목 입력 검증 실패: current_text={current_text}")

        return {
            "status": "success",
            "title": title,
            "title_len": len(title),
            "current_text": current_text,
        }

    def verify_title(self, write_frame, expected_title):
        expected_title = str(expected_title or "").strip()

        selectors = [
            ".se-documentTitle",
            ".se-section-documentTitle",
            ".se-title-text",
        ]

        for selector in selectors:
            try:
                locator = write_frame.locator(selector)

                if locator.count() <= 0:
                    continue

                text = locator.first.inner_text(timeout=3000)
                text = str(text or "").strip()

                # placeholder '제목'이 섞이는 경우를 고려
                normalized = text.replace("제목", "").strip()

                if expected_title in text or expected_title in normalized:
                    return True, text

            except Exception:
                pass

        return False, ""


def input_title(page, write_frame, title, logger=None, session=None, verbose=True):
    worker = V2TitleInput(verbose=verbose)
    return worker.input_title(
        page=page,
        write_frame=write_frame,
        title=title,
        logger=logger,
        session=session,
    )
