# -*- coding: utf-8 -*-

import json
import re
import requests

from db import get_conn


def get_target_drafts(limit=20):
    conn = get_conn()
    try:
        with conn.cursor() as cur:
            cur.execute("""
                SELECT
                    id,
                    article_no
                FROM blog_article_drafts
                WHERE article_no IS NOT NULL
                  AND article_no != ''
                ORDER BY id DESC
                LIMIT %s
            """, (int(limit),))
            return cur.fetchall()
    finally:
        conn.close()


def delete_old_images(draft_id):
    conn = get_conn()
    try:
        with conn.cursor() as cur:
            cur.execute("""
                DELETE FROM blog_article_images
                WHERE draft_id = %s
            """, (draft_id,))
        conn.commit()
    finally:
        conn.close()


def insert_image(draft_id, article_no, image_url, sort_order):
    conn = get_conn()
    try:
        with conn.cursor() as cur:
            cur.execute("""
                INSERT INTO blog_article_images
                    (draft_id, article_no, image_url, sort_order)
                VALUES
                    (%s, %s, %s, %s)
            """, (
                draft_id,
                article_no,
                image_url,
                sort_order
            ))
        conn.commit()
    finally:
        conn.close()


def extract_image_urls_from_text(text):
    urls = []

    patterns = [
        r'https://landthumb-phinf\.pstatic\.net/[^\s"\'<>]+',
        r'https://landthumb-phinf\.pstatic\.net/Mj[^\s"\'<>]+',
        r'https://mblogthumb-phinf\.pstatic\.net/[^\s"\'<>]+',
        r'https://post-phinf\.pstatic\.net/[^\s"\'<>]+',
    ]

    for pattern in patterns:
        found = re.findall(pattern, text)

        for url in found:
            url = url.replace("\\/", "/")
            url = url.replace("&amp;", "&")

            if url not in urls:
                urls.append(url)

    return urls


def fetch_article_page(article_no):
    url = f"https://new.land.naver.com/articles/{article_no}"

    headers = {
        "User-Agent": (
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
            "AppleWebKit/537.36 (KHTML, like Gecko) "
            "Chrome/124.0 Safari/537.36"
        ),
        "Referer": "https://new.land.naver.com/",
        "Accept-Language": "ko-KR,ko;q=0.9,en;q=0.8",
    }

    res = requests.get(
        url,
        headers=headers,
        timeout=15
    )

    res.raise_for_status()

    return res.text


def collect_images_by_article_no(article_no):
    print(f"[FETCH ARTICLE] article_no={article_no}")

    html = fetch_article_page(article_no)

    urls = extract_image_urls_from_text(html)

    print(f"[IMAGE FOUND] count={len(urls)}")

    return urls


def run_collector(limit=20):
    drafts = get_target_drafts(limit=limit)

    print("=" * 80)
    print(f"[TARGET DRAFT COUNT] {len(drafts)}")
    print("=" * 80)

    for draft in drafts:
        draft_id = draft["id"]
        article_no = str(draft.get("article_no") or "").strip()

        print("-" * 80)
        print(f"[COLLECT START] draft_id={draft_id}, article_no={article_no}")

        if not article_no:
            print("[SKIP] article_no 없음")
            continue

        try:
            image_urls = collect_images_by_article_no(article_no)

            if not image_urls:
                print("[NO IMAGE] 이미지 URL 없음")
                continue

            delete_old_images(draft_id)

            for idx, image_url in enumerate(image_urls[:10]):
                insert_image(
                    draft_id=draft_id,
                    article_no=article_no,
                    image_url=image_url,
                    sort_order=idx
                )

                print(f"[IMAGE SAVE] {idx + 1}: {image_url}")

            print("[COLLECT SUCCESS] 이미지 저장 완료")

        except Exception as e:
            print("[COLLECT ERROR]", str(e))


if __name__ == "__main__":
    run_collector(limit=20)