# -*- coding: utf-8 -*-

import os
import re
import json
import time
import random
import requests
from urllib.parse import quote


BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DEBUG_DIR = os.path.join(BASE_DIR, "debug_outputs")

os.makedirs(DEBUG_DIR, exist_ok=True)


HEADERS = {
    "User-Agent": (
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
        "AppleWebKit/537.36 (KHTML, like Gecko) "
        "Chrome/124.0.0.0 Safari/537.36"
    ),
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "ko-KR,ko;q=0.9,en;q=0.8",
    "Referer": "https://new.land.naver.com/",
}


def request_text(url):
    print("[REQUEST]", url)

    time.sleep(random.uniform(0.8, 1.6))

    try:
        res = requests.get(url, headers=HEADERS, timeout=20)
        print("[STATUS]", res.status_code)
        print("[CONTENT-TYPE]", res.headers.get("content-type"))

        if res.status_code != 200:
            return ""

        return res.text

    except Exception as e:
        print("[REQUEST ERROR]", str(e))
        return ""


def find_patterns(text):
    patterns = {
        "articleNo": [
            r"articleNo[=:\"'\s]+([0-9]{8,})",
            r"articleNo=([0-9]{8,})",
            r"article_no[=:\"'\s]+([0-9]{8,})",
        ],
        "office": [
            r"officeId[=:\"'\s]+([A-Za-z0-9_\-]+)",
            r"officeNo[=:\"'\s]+([A-Za-z0-9_\-]+)",
            r"realtorId[=:\"'\s]+([A-Za-z0-9_\-]+)",
            r"realtorNo[=:\"'\s]+([A-Za-z0-9_\-]+)",
            r"agentId[=:\"'\s]+([A-Za-z0-9_\-]+)",
            r"cpId[=:\"'\s]+([A-Za-z0-9_\-]+)",
        ],
        "long_numbers": [
            r"\b([0-9]{10,})\b",
        ],
        "api_paths": [
            r"(/api/[A-Za-z0-9_\-/?.=&%]+)",
            r"(https://new\.land\.naver\.com/api/[A-Za-z0-9_\-/?.=&%]+)",
        ],
    }

    result = {}

    for group, group_patterns in patterns.items():
        found = set()

        for pattern in group_patterns:
            for match in re.findall(pattern, text or ""):
                if isinstance(match, tuple):
                    match = match[0]
                found.add(str(match).strip())

        result[group] = sorted(found)

    return result


def save_debug_file(filename, content):
    path = os.path.join(DEBUG_DIR, filename)

    with open(path, "w", encoding="utf-8") as f:
        f.write(content)

    print("[SAVED]", path)


def main():
    keyword = input("중개사무소명 또는 대표자명 입력: ").strip()

    if not keyword:
        print("검색어가 없습니다.")
        return

    encoded = quote(keyword)

    urls = [
        f"https://search.naver.com/search.naver?query={encoded}",
        f"https://new.land.naver.com/search?query={encoded}",
        f"https://new.land.naver.com/offices?query={encoded}",
    ]

    total_report = {
        "keyword": keyword,
        "results": []
    }

    for idx, url in enumerate(urls, start=1):
        html = request_text(url)

        filename = f"naver_debug_{idx}.html"
        save_debug_file(filename, html[:500000])

        patterns = find_patterns(html)

        report_item = {
            "url": url,
            "html_length": len(html),
            "patterns": patterns,
        }

        total_report["results"].append(report_item)

        print("-" * 80)
        print("[URL]", url)
        print("[HTML LENGTH]", len(html))
        print("[ARTICLE COUNT]", len(patterns.get("articleNo", [])))
        print("[OFFICE KEY COUNT]", len(patterns.get("office", [])))
        print("[LONG NUMBER COUNT]", len(patterns.get("long_numbers", [])))
        print("[API PATH COUNT]", len(patterns.get("api_paths", [])))
        print("-" * 80)

    report_json = json.dumps(total_report, ensure_ascii=False, indent=2)
    save_debug_file("naver_debug_report.json", report_json)

    print("\n완료되었습니다.")
    print("debug_outputs 폴더 안의 naver_debug_report.json 결과를 확인하세요.")


if __name__ == "__main__":
    main()