# -*- coding: utf-8 -*-

import random
import time

try:
    from .human_typing import human_type_text
except Exception:
    from human_typing import human_type_text


def _safe_get(row, key, default=""):
    if not row:
        return default

    try:
        if isinstance(row, dict):
            return row.get(key, default)
        return getattr(row, key, default)
    except Exception:
        return default


def build_human_tail_comment(draft=None, queue=None):
    """
    본문 하단에 사람이 직접 덧붙이는 느낌의 300~700자 코멘트를 생성한다.
    너무 광고성으로 보이지 않게 상담/방문/확인 안내 중심으로 구성한다.
    """
    draft = draft or {}
    queue = queue or {}

    title = str(
        _safe_get(draft, "draft_title")
        or _safe_get(queue, "publish_title")
        or ""
    ).strip()

    openers = [
        "마지막으로 한 번 더 정리드리면,",
        "방문 전 참고하시면 좋은 부분을 덧붙입니다.",
        "상담 전에 확인하시면 좋은 내용을 간단히 남깁니다.",
        "실제 확인 시에는 아래 내용도 함께 체크해보시면 좋습니다.",
    ]

    bodies = [
        "매물은 같은 단지 안에서도 동, 층, 방향, 내부 상태에 따라 체감 차이가 생길 수 있습니다. 사진과 기본 정보만으로 판단하기보다 실제 방문 시 채광, 소음, 주차 동선, 엘리베이터 이용 편의성까지 함께 확인해보시는 것이 좋습니다.",
        "가격과 조건은 확인 시점에 따라 달라질 수 있으므로 문의 전 현재 가능 여부를 먼저 확인해 주세요. 특히 입주 가능일, 잔금 일정, 관리비, 수리 여부는 실제 계약 판단에 중요한 부분이라 상담 과정에서 다시 한번 체크하시는 것을 권해드립니다.",
        "관심 있는 매물이라면 주변 생활권도 같이 보시는 것이 좋습니다. 장보기, 병원, 학교, 대중교통, 출퇴근 동선처럼 매일 이용하는 생활 요소를 함께 비교하면 실제 거주 만족도를 판단하는 데 도움이 됩니다.",
        "현장 방문 시에는 구조와 면적뿐 아니라 수납, 창 방향, 환기, 층간 소음 가능성, 단지 출입 동선도 함께 살펴보시면 좋습니다. 조건이 맞는 매물은 빠르게 변동될 수 있어 상담 시점의 최신 상태 확인이 필요합니다.",
    ]

    closers = [
        "궁금하신 점은 편하게 문의 주시면 현재 확인 가능한 기준으로 안내드리겠습니다.",
        "방문 상담을 원하시면 매물 가능 여부를 먼저 확인한 뒤 일정 조율을 도와드리겠습니다.",
        "실제 조건은 상담 시점에 다시 확인해드리는 것이 가장 정확합니다.",
        "관심 있으신 분들은 현재 상태를 먼저 확인하신 뒤 방문 일정을 잡아보시면 좋겠습니다.",
    ]

    parts = []

    if title and random.random() < 0.45:
        parts.append(f"{title} 관련해서 추가로 참고하실 내용을 남깁니다.")

    parts.append(random.choice(openers))
    parts.append(random.choice(bodies))
    parts.append(random.choice(closers))

    comment = "\n\n".join(parts).strip()

    if len(comment) < 300:
        extra = random.choice([
            "또한 실제 방문 전에는 지도상 위치와 주변 도로 흐름을 확인해보시면 좋습니다. 같은 조건이라도 생활 동선이 맞는지에 따라 만족도가 달라질 수 있습니다.",
            "매물 정보는 포스팅 시점 기준으로 정리된 내용이므로 거래 완료나 조건 변경 가능성이 있습니다. 문의 시 최신 조건으로 다시 안내드리겠습니다.",
        ])
        comment = comment + "\n\n" + extra

    if len(comment) > 700:
        comment = comment[:700].rsplit(" ", 1)[0].strip()

    return comment


def type_tail_comment_after_body(page, frame=None, draft=None, queue=None):
    """
    렌더링 본문 붙여넣기 이후, 에디터 하단에 코멘트를 실제 키보드로 입력한다.
    frame 인자는 호환용으로 받지만 키보드는 page 기준으로 입력한다.
    """
    comment = build_human_tail_comment(draft=draft, queue=queue)

    if not comment:
        print("[TAIL COMMENT SKIP] empty")
        return False

    print("[TAIL COMMENT START]", f"len={len(comment)}")

    try:
        page.keyboard.press("End")
        page.wait_for_timeout(random.randint(400, 900))
        page.keyboard.press("Enter")
        page.keyboard.press("Enter")
        page.wait_for_timeout(random.randint(500, 1300))

        typed = human_type_text(
            page=page,
            text=comment,
            min_delay_ms=35,
            max_delay_ms=125,
            pause_chance=0.055,
        )

        page.wait_for_timeout(random.randint(800, 1800))

        print("[TAIL COMMENT DONE]", f"len={len(comment)}", f"typed={typed}")
        return True

    except Exception as e:
        print("[TAIL COMMENT ERROR]", str(e))
        return False
