# -*- coding: utf-8 -*-

import re


def normalize_text(value):
    value = str(value or "").strip().lower()
    value = re.sub(r"\s+", "", value)
    value = value.replace("-", "")
    value = value.replace(".", "")
    value = value.replace("(", "")
    value = value.replace(")", "")
    return value


def normalize_phone(value):
    return re.sub(r"[^0-9]", "", str(value or ""))


def contains_match(source, target):
    source = normalize_text(source)
    target = normalize_text(target)

    if not source or not target:
        return False

    return source in target or target in source


def phone_match(source, target):
    source = normalize_phone(source)
    target = normalize_phone(target)

    if not source or not target:
        return False

    return source == target or source[-8:] == target[-8:]


def calc_realtor_match_score(realtor, detail):
    """
    realtor: blog_realtors row
    detail: fin_land_parser 결과 또는 상세수집 dict
    """

    score = 0
    reasons = []

    # 등록번호 / 개설등록번호
    realtor_license = realtor.get("license_number", "")
    detail_license = (
        detail.get("license_number")
        or detail.get("registration_number")
        or detail.get("realtor_registration_number")
        or ""
    )

    if contains_match(realtor_license, detail_license):
        score += 70
        reasons.append("등록번호 일치 +70")

    # 중개업소명
    realtor_office = realtor.get("office_name", "")
    detail_office = (
        detail.get("realtor_office_name")
        or detail.get("office_name")
        or detail.get("broker_office_name")
        or ""
    )

    if contains_match(realtor_office, detail_office):
        score += 25
        reasons.append("중개업소명 일치 +25")

    # 대표전화
    realtor_phone = (
        realtor.get("office_phone")
        or realtor.get("phone")
        or ""
    )

    detail_phone = (
        detail.get("realtor_phone")
        or detail.get("office_phone")
        or detail.get("phone")
        or ""
    )

    if phone_match(realtor_phone, detail_phone):
        score += 30
        reasons.append("대표전화 일치 +30")

    # 휴대폰
    realtor_mobile = (
        realtor.get("mobile_phone")
        or realtor.get("mobile")
        or ""
    )

    detail_mobile = (
        detail.get("realtor_mobile")
        or detail.get("mobile_phone")
        or detail.get("mobile")
        or ""
    )

    if phone_match(realtor_mobile, detail_mobile):
        score += 25
        reasons.append("휴대폰 일치 +25")

    # 대표자명
    realtor_rep = realtor.get("representative_name", "")
    detail_rep = (
        detail.get("representative_name")
        or detail.get("realtor_name")
        or detail.get("broker_name")
        or ""
    )

    if contains_match(realtor_rep, detail_rep):
        score += 10
        reasons.append("대표자명 일치 +10")

    if score >= 70:
        status = "matched"
    elif score >= 40:
        status = "candidate"
    else:
        status = "rejected"

    return {
        "score": score,
        "status": status,
        "reasons": reasons,
    }