# -*- coding: utf-8 -*-

import json
import requests

from naver_session_manager import (
    get_naver_land_cookies,
)


HEADERS = {
    "User-Agent": (
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
        "AppleWebKit/537.36 (KHTML, like Gecko) "
        "Chrome/136.0.0.0 Safari/537.36"
    ),
    "Referer": "https://new.land.naver.com/",
    "Accept": "application/json, text/plain, */*",
    "Accept-Language": "ko-KR,ko;q=0.9,en;q=0.8",
    "Connection": "keep-alive",
}


def build_article_api_url(article_no):

    return (
        f"https://new.land.naver.com/api/articles/{article_no}"
    )


def create_session():

    session = requests.Session()

    session.headers.update(HEADERS)

    cookies = get_naver_land_cookies()

    for cookie in cookies:

        try:

            session.cookies.set(
                cookie.get("name"),
                cookie.get("value"),
                domain=cookie.get("domain"),
            )

        except Exception:
            pass

    print("[SESSION COOKIE COUNT]",
          len(session.cookies))

    return session


def safe_int(value):

    try:
        return int(value)
    except:
        return 0


def parse_images(data):

    result = []

    grand_plan_list = (
        data.get("articleDetail", {})
        .get("grandPlanList", [])
    )

    for idx, img in enumerate(grand_plan_list):

        image_url = (
            img.get("imageSrc")
            or ""
        )

        if not image_url:
            continue

        result.append({
            "image_order": idx + 1,
            "image_url": image_url,
            "image_type": "building",
            "width": safe_int(img.get("imageWidth")),
            "height": safe_int(img.get("imageHeight")),
        })

    return result


def parse_article(data):

    detail = data.get("articleDetail") or {}
    addition = data.get("articleAddition") or {}
    price = data.get("articlePrice") or {}

    return {
        "article_no": detail.get("articleNo", ""),
        "article_name": detail.get("articleName", ""),
        "apt_name": detail.get("aptName", ""),
        "trade_type": detail.get("tradeTypeName", ""),
        "real_estate_type": detail.get("realEstateTypeName", ""),
        "floor_info": addition.get("floorInfo", ""),
        "direction": addition.get("direction", ""),
        "area1": detail.get("area1", ""),
        "area2": detail.get("area2", ""),
        "deal_price": addition.get("dealOrWarrantPrc", ""),
        "rent_price": price.get("rentPrice", ""),
        "room_count": addition.get("roomCount", ""),
        "bath_count": addition.get("bathroomCount", ""),
        "maintenance_fee": addition.get("maintenanceFee", ""),
        "building_name": addition.get("buildingName", ""),
        "article_feature": addition.get(
            "articleFeatureDescription", ""
        ),
        "detail_description": addition.get(
            "detailDescription", ""
        ),
        "latitude": detail.get("latitude", ""),
        "longitude": detail.get("longitude", ""),
    }


def parse_realtor(data):

    realtor = data.get("articleRealtor") or {}

    return {
        "realtor_name": realtor.get("realtorName", ""),
        "representative_name": realtor.get(
            "representativeName", ""
        ),
        "address": realtor.get("address", ""),
        "phone": realtor.get(
            "representativeTelNo", ""
        ),
    }


def parse_school_info(data):

    result = []

    schools = (
        data.get("schoolInfo", {})
        .get("schools", [])
    )

    for school in schools:

        result.append({
            "school_name": school.get(
                "schoolName", ""
            ),
            "school_type": school.get(
                "schoolTypeName", ""
            ),
            "distance": school.get(
                "walkingTime", ""
            ),
        })

    return result


def fetch_article(article_no):

    session = create_session()

    api_url = build_article_api_url(article_no)

    print("=" * 80)
    print("[FETCH ARTICLE]")
    print("[ARTICLE NO]", article_no)
    print("[API URL]", api_url)

    res = session.get(
        api_url,
        timeout=30,
    )

    print("[STATUS]", res.status_code)

    if res.status_code != 200:

        return {
            "ok": False,
            "status": res.status_code,
            "error": res.text[:500],
        }

    data = res.json()

    result = {
        "ok": True,
        "article": parse_article(data),
        "images": parse_images(data),
        "schools": parse_school_info(data),
        "realtor": parse_realtor(data),
        "raw": data,
    }

    print("[ARTICLE NAME]",
          result["article"]["article_name"])

    print("[IMAGE COUNT]",
          len(result["images"]))

    print("[SCHOOL COUNT]",
          len(result["schools"]))

    return result


if __name__ == "__main__":

    article_no = "2627638152"

    result = fetch_article(article_no)

    print("=" * 80)

    print(
        json.dumps(
            result,
            ensure_ascii=False,
            indent=2,
        )
    )