#!/usr/bin/env python3
import json, re, html, os, sys, time, glob, urllib.request, urllib.parse

UA = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0"}
BASE = "https://dobrotniy-dom.ru/product/serijnye-karkasnye-doma/"

SLUGS = ["aleksandriya", "aleksandriya-1", "aleksandriya-2", "aleksandriya-barn",
         "radonezhskiy", "sergievskiy", "troitskiy", "voskresenskiy", "voznesenskiy", "znamenskiy",
         "banya-ilinskaya", "barin", "bogorodskiy", "ferdinand", "mikhaylovskiy", "nevskiy",
         "rozhdestvenskiy", "skolkovskiy", "sloboda-dupleks", "spasskiy", "storozhevskiy",
         "timba", "uspenskiy"]

token = None
for line in open("/root/site/yandex/.env", encoding="utf-8"):
    if line.startswith("YANDEX_ACCESS_TOKEN="):
        token = line.split("=", 1)[1].strip()
H = {"Authorization": f"OAuth {token}"}

WORK = "/root/site/video/site_renders"

def fetch(url, binary=False):
    req = urllib.request.Request(url, headers=UA)
    with urllib.request.urlopen(req, timeout=90) as r:
        data = r.read()
    return data if binary else data.decode("utf-8", errors="replace")

def disk_mkdir(path):
    url = "https://cloud-api.yandex.net/v1/disk/resources?path=" + urllib.parse.quote(path)
    req = urllib.request.Request(url, method="PUT", headers=H)
    try:
        with urllib.request.urlopen(req, timeout=60) as r:
            return True
    except urllib.error.HTTPError as e:
        return "already" in e.read().decode(errors="replace")

def disk_upload(path, local_file):
    url = ("https://cloud-api.yandex.net/v1/disk/resources/upload?path=" +
           urllib.parse.quote(path) + "&overwrite=true")
    req = urllib.request.Request(url, headers=H)
    with urllib.request.urlopen(req, timeout=60) as r:
        href = json.loads(r.read().decode())["href"]
    with open(local_file, "rb") as f:
        data = f.read()
    req = urllib.request.Request(href, data=data, method="PUT")
    with urllib.request.urlopen(req, timeout=180) as r:
        return r.status

def classify(page):
    """returns (name, renders[urls], plans[urls])"""
    h1m = re.search(r'<h1[^>]*>(.*?)</h1>', page, flags=re.S)
    name = re.sub(r'<[^>]+>', '', h1m.group(1)).strip() if h1m else ""
    name = html.unescape(name).strip()
    # оригиналы: filename -> url
    originals = {}
    for m in re.finditer(r'/upload/iblock/[a-z0-9]+/([a-z0-9]+\.(?:png|jpe?g|webp))', page):
        fname = m.group(1)
        originals.setdefault(fname, "https://dobrotniy-dom.ru" + m.group(0))
    # группы fancybox: берём оригинал из <a href> + группу из data-fancybox
    renders, plans = {}, {}
    for url, grp in re.findall(r'<a href="(/upload/iblock/[a-z0-9]+/[a-z0-9]+\.(?:png|jpe?g|webp))"[^>]*data-fancybox="(big-gallery|layouts)"', page):
        fname = url.rsplit("/", 1)[-1]
        (renders if grp == "big-gallery" else plans)[fname] = "https://dobrotniy-dom.ru" + url
    return name, list(renders.values()), list(plans.values())

summary = {}
disk_mkdir("/Рендеры с сайта")
for slug in SLUGS:
    try:
        page = fetch(BASE + slug + "/")
    except Exception as e:
        print("СЕТЬ FAIL", slug, e); continue
    name, renders, plans = classify(page)
    if not name:
        name = slug
    print(f"=== {slug} -> {name} | рендеры: {len(renders)}, планировки: {len(plans)}")
    counts = {"Внешний вид": 0, "Планировки": 0}
    folder = os.path.join(WORK, name)
    os.makedirs(folder, exist_ok=True)
    disk_mkdir("/Рендеры с сайта/" + name)
    idx = 0
    for grp, items in (("Внешний вид", renders), ("Планировки", plans)):
        for url in sorted(items):
            idx += 1
            fname = url.rsplit("/", 1)[-1]
            ext = fname.rsplit(".", 1)[-1]
            local = os.path.join(folder, f"{idx:02d}.{ext}")
            if not os.path.exists(local):
                try:
                    data = fetch(url, binary=True)
                    open(local, "wb").write(data)
                except Exception as e:
                    print("  DOWNLOAD FAIL", fname, e); continue
            try:
                disk_upload(f"/Рендеры с сайта/{name}/{idx:02d}.{ext}", local)
            except Exception as e:
                print("  UPLOAD FAIL", fname, e)
            counts[grp] += 1
            time.sleep(0.15)
    summary[name] = counts
    print(f"  -> {counts}")

with open("/root/site/video/site_summary23.json", "w", encoding="utf-8") as f:
    json.dump(summary, f, ensure_ascii=False, indent=1)
total = sum(sum(v.values()) for v in summary.values())
print("DONE. Проектов:", len(summary), "| файлов:", total)
