#!/usr/bin/env python3

import csv
import json
import re
import sys
import time
from html import unescape
import subprocess

CATALOG = "/home/bowerybay/public_html/wilgus-automation/wilgus-meta-hotel-catalog.csv"
OUTPUT = "/home/bowerybay/public_html/wilgus-automation/wilgus-property-amenities.json"

def clean(text):
    text = re.sub(r"<[^>]+>", "", text)
    return " ".join(unescape(text).split())

def get_html(url):
    r = subprocess.run(["curl","-sL","--fail",url],capture_output=True,text=True,timeout=30)
    if r.returncode: raise RuntimeError("curl failed")
    return r.stdout

def extract_amenities(html):
    results = {}

    # Each amenity category begins with an H3 and is followed by
    # its vrp-amen-group.
    pattern = re.compile(
        r"<h3[^>]*>(.*?)</h3>\s*"
        r"<div[^>]*class=[\"'][^\"']*vrp-amen-group[^\"']*[\"'][^>]*>(.*?)</div>",
        re.I | re.S,
    )

    amenity_pattern = re.compile(
        r"<li[^>]*class=[\"'][^\"']*abe-amen-name[^\"']*[\"'][^>]*>(.*?)</li>",
        re.I | re.S,
    )

    for category_html, group_html in pattern.findall(html):
        category = clean(category_html)
        amenities = [clean(x) for x in amenity_pattern.findall(group_html)]
        amenities = [x for x in amenities if x]

        if category and amenities:
            results[category] = amenities

    return results

def load_catalog():
    with open(CATALOG, newline="", encoding="utf-8-sig") as f:
        return list(csv.DictReader(f))

def main():
    rows = load_catalog()

    # Optional property IDs on command line.
    # Example:
    # python3 scrape-wilgus-amenities.py 231244 208321
    wanted = set(sys.argv[1:])

    if wanted:
        rows = [r for r in rows if r["id"] in wanted]

    output = {}

    for i, row in enumerate(rows, 1):
        prop_id = row["id"]
        url = row["link"]

        print(f"[{i}/{len(rows)}] {prop_id} {url}", flush=True)

        try:
            html = get_html(url)
            amenities = extract_amenities(html)

            output[prop_id] = {
                "id": prop_id,
                "address": row.get("address.addr1", ""),
                "city": row.get("address.city", ""),
                "url": url,
                "amenities": amenities,
            }

            print(
                f"    {sum(len(v) for v in amenities.values())} amenities "
                f"in {len(amenities)} categories",
                flush=True,
            )

        except Exception as e:
            output[prop_id] = {
                "id": prop_id,
                "address": row.get("address.addr1", ""),
                "city": row.get("address.city", ""),
                "url": url,
                "error": str(e),
            }
            print(f"    ERROR: {e}", flush=True)

        time.sleep(0.25)

    with open(OUTPUT, "w", encoding="utf-8") as f:
        json.dump(output, f, indent=2, ensure_ascii=False)

    print(f"\nSaved: {OUTPUT}")

if __name__ == "__main__":
    main()
