import xml.etree.ElementTree as ET
import urllib.request
import os
import logging

# --- Настройки ---
SOURCE_URL = "https://bcapi.business-car.ru/bccloud/feeds/?x-authorization=cabc85ac-bba6-4f72-afaa-d03070d16bb5&feed=6d6a0ab03b184339a82f13d9e8e351ec.xml"
OUTPUT_DIR = "/var/www/bcfeeds/feed/yandexmaps"
LOG_FILE   = "/var/www/bcfeeds/generate_feeds.log"

logging.basicConfig(
    filename=LOG_FILE,
    level=logging.INFO,
    format="%(asctime)s %(levelname)s %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S"
)

LOCATIONS = [
    {"name": "Toyota и Lexus Бизнес Кар Рублевский",    "utm": "?utm_medium=maps&utm_campaign=yandex_maps_price_–_TCR",  "file": "feed_TCR.xml"},
    {"name": "Бизнес Кар, Toyota",                      "utm": "?utm_medium=maps&utm_campaign=yandex_maps_price_–_TCK",  "file": "feed_TCK.xml"},
    {"name": "Toyota, Бизнес Кар Лосиный Остров",       "utm": "?utm_medium=maps&utm_campaign=yandex_maps_price_–_TCLO", "file": "feed_TCLO.xml"},
    {"name": "Lexus Бизнес Кар Левобережный",           "utm": "?utm_medium=maps&utm_campaign=yandex_maps_price_–_TCLB", "file": "feed_TCLB.xml"},
    {"name": "Toyota Бизнес Кар Битца",                 "utm": "?utm_medium=maps&utm_campaign=yandex_maps_price_–_TCB",  "file": "feed_TCB.xml"},
    {"name": "Toyota Бизнес Кар Серебряный Бор",        "utm": "?utm_medium=maps&utm_campaign=yandex_maps_price_–_TCSB", "file": "feed_TCSB.xml"},
]

BASE_URL  = "https://www.business-car.ru"
base_cats = {"Toyota": 10, "Lexus": 20}
NAME_O    = "<" + "name" + ">"
NAME_C    = "</" + "name" + ">"

def xe(s):
    return s.replace("&","&amp;").replace("<","&lt;").replace(">","&gt;").replace('"',"&quot;")

def generate(loc, tl_cars, models):
    utm      = loc["utm"]
    page_url = xe(f"{BASE_URL}/{utm}")
    L = []
    L.append('<?xml version="1.0" encoding="UTF-8"?>')
    L.append("<yml_catalog>")
    L.append("  <shop>")
    L.append(f"    {NAME_O}{xe(loc['name'])}{NAME_C}")
    L.append("    <categories>")
    L.append('      <category id="10">Toyota</category>')
    L.append('      <category id="20">Lexus</category>')
    for (mark, model), cid in sorted(models.items(), key=lambda x: x[1]):
        L.append(f'      <category id="{cid}" parentId="{base_cats[mark]}">{xe(model)}</category>')
    L.append("    </categories>")
    L.append("    <offers>")

    for car in tl_cars:
        vin    = (car.findtext("vin") or "").strip()
        mark   = car.findtext("mark_id")
        folder = (car.findtext("folder_id") or "").split(",")[0].strip()
        cat    = models[(mark, folder)]
        offer_name = xe(f"{mark} {(car.findtext('folder_id') or '').strip()} {(car.findtext('modification_id') or '').strip()}")
        price  = (car.findtext("price") or "").strip()
        cur    = (car.findtext("currency") or "RUR").strip()
        images = car.findall("images/image")
        desc   = xe((car.findtext("description") or "").strip())

        L.append(f'      <offer id="{vin}">')
        L.append(f"        {NAME_O}{offer_name}{NAME_C}")
        L.append(f"        <typePrefix>Автомобиль</typePrefix>")
        L.append(f"        <vendor>{mark}</vendor>")
        L.append(f"        <model>{xe(folder)}</model>")
        L.append(f"        <price>{price}</price>")
        L.append(f"        <currencyId>{cur}</currencyId>")
        L.append(f"        <categoryId>{cat}</categoryId>")
        for img in images:
            if img.text and img.text.strip():
                L.append(f"        <picture>{img.text.strip()}</picture>")
        L.append(f"        <url>{page_url}</url>")
        if desc:
            L.append(f"        <description>{desc}</description>")
        L.append(f"      </offer>")

    L.append("    </offers>")
    L.append("  </shop>")
    L.append("</yml_catalog>")
    return "\n".join(L)

def main():
    logging.info("=== Запуск генерации фидов ===")

    try:
        logging.info(f"Скачиваем фид: {SOURCE_URL}")
        with urllib.request.urlopen(SOURCE_URL, timeout=60) as r:
            xml_data = r.read()
        logging.info(f"Скачано {len(xml_data):,} байт")
    except Exception as e:
        logging.error(f"Ошибка скачивания: {e}")
        return

    try:
        root = ET.fromstring(xml_data)
        tl_cars = [c for c in root.find("cars") if c.findtext("mark_id") in ("Toyota", "Lexus")]
        logging.info(f"Найдено Toyota+Lexus: {len(tl_cars)} автомобилей")
    except Exception as e:
        logging.error(f"Ошибка парсинга XML: {e}")
        return

    models = {}
    cat_id = 100
    for car in tl_cars:
        mark   = car.findtext("mark_id")
        folder = (car.findtext("folder_id") or "").split(",")[0].strip()
        key = (mark, folder)
        if key not in models:
            models[key] = cat_id
            cat_id += 1

    os.makedirs(OUTPUT_DIR, exist_ok=True)
    for loc in LOCATIONS:
        try:
            content = generate(loc, tl_cars, models)
            path = os.path.join(OUTPUT_DIR, loc["file"])
            with open(path, "w", encoding="utf-8") as f:
                f.write(content)
            logging.info(f"Сохранён: {path}")
        except Exception as e:
            logging.error(f"Ошибка генерации {loc['file']}: {e}")

    logging.info("=== Генерация завершена ===")

if __name__ == "__main__":
    main()
