# -*- coding: utf-8 -*-
"""站点配置：UK / DE 各自独立的浏览器参数与清洗规则。
调用方：browser.py 按 site 键启动对应持久浏览器；extract.py 按 site 键选清洗器。
"""
import re

SITE_CONFIGS = {
    "UK": {
        "domain": ".amazon.co.uk",
        "tld": "amazon.co.uk",
        "postcode": "OX12JD",
        "currency": "GBP",
        "currency_symbol": "£",
        "locale": "en-GB",
        "timezone": "Europe/London",
        "profile_dir": "/home/user/profiles/UK",
        "kw_in_stock": ["in stock", "available"],
        "kw_out_of_stock": ["currently unavailable", "out of stock"],
    },
    "DE": {
        "domain": ".amazon.de",
        "tld": "amazon.de",
        "postcode": "10115",
        "currency": "EUR",
        "currency_symbol": "€",
        "locale": "de-DE",
        "timezone": "Europe/Berlin",
        "profile_dir": "/home/user/profiles/DE",
        "kw_in_stock": ["auf lager", "lieferbar"],
        "kw_out_of_stock": ["derzeit nicht verfügbar", "nicht auf lager"],
    },
}

UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36"

# ---------- 数值清洗：英德小数/千分位相反 ----------
# UK: 1,234.56（逗号千分位，点小数）  DE: 1.234,56（点千分位，逗号小数）

def clean_number_uk(s):
    if not s: return None
    s = re.sub(r"[^\d,.\-]", "", str(s))
    s = s.replace(",", "")          # 逗号=千分位
    try: return round(float(s), 4)
    except Exception: return None

def clean_number_de(s):
    if not s: return None
    s = re.sub(r"[^\d,.\-]", "", str(s))
    if "," in s and "." in s:
        s = s.replace(".", "").replace(",", ".")   # 点=千分位，逗号=小数
    elif re.fullmatch(r"\d{1,3}(\.\d{3})+", s):
        s = s.replace(".", "")                     # 纯点分组=千分位（24.354 -> 24354）
    else:
        s = s.replace(",", ".")
    try: return round(float(s), 4)
    except Exception: return None

def clean_price_uk(s):
    """'£16.99' -> 16.99"""
    if not s: return None
    return clean_number_uk(re.sub(r"[£$]", "", str(s)))

def clean_price_de(s):
    """'25,46€' / '1.234,56 €' -> float"""
    if not s: return None
    return clean_number_de(re.sub(r"[€]", "", str(s)))

def clean_rating_uk(s):
    """'4.4 out of 5 stars' -> 4.4"""
    m = re.search(r"([\d.]+)\s+out of", s or "")
    return float(m.group(1)) if m else clean_number_uk(s)

def clean_rating_de(s):
    """'4,4 von 5 Sternen' -> 4.4"""
    m = re.search(r"([\d,]+)\s+von", s or "")
    return clean_number_de(m.group(1)) if m else clean_number_de(s)

def clean_bsr_uk(s):
    """'#2 in ...' / '2 in ...' -> 2"""
    m = re.search(r"#([\d,]+)", s or "")
    return clean_number_uk(m.group(1)) if m else None

def clean_bsr_de(s):
    """'Nr. 1.754 in ...' -> 1754"""
    m = re.search(r"Nr\.?\s*([\d.,]+)", s or "")
    return clean_number_de(m.group(1)) if m else None

def clean_count_uk(s):
    """'(23,742)' -> 23742"""
    return clean_number_uk(s)

def clean_count_de(s):
    """'(24.354)' -> 24354"""
    return clean_number_de(s)

CLEANERS = {
    "UK": {
        "price": clean_price_uk,
        "rating": clean_rating_uk,
        "count": clean_count_uk,
        "bsr": clean_bsr_uk,
        "number": clean_number_uk,
    },
    "DE": {
        "price": clean_price_de,
        "rating": clean_rating_de,
        "count": clean_count_de,
        "bsr": clean_bsr_de,
        "number": clean_number_de,
    },
}

def clean_histogram(site, raw):
    """'5 star 70% 4 star 14% ...' -> {'5': 70, '4': 14, ...}"""
    out = {}
    for star in ["5", "4", "3", "2", "1"]:
        pat = rf"{star}\s*(?:star|stern|sterne)\s+([\d.,]+)\s*%"
        m = re.search(pat, raw or "", re.I)
        if m:
            out[star] = CLEANERS[site]["number"](m.group(1))
    return out or None
