#!/usr/bin/env python3
"""
Gieniutkowo Donation Totals
───────────────────────────
Scrapes https://pomagam.pl/org/gieniutkowo using a headless browser,
handles "Zobacz więcej" pagination, and outputs JSON.

Install once:
    pip install playwright --break-system-packages
    playwright install chromium

Run:
    python3 gieniutkowo_donations.py
"""

import re
import sys
import json
from dataclasses import dataclass, asdict
from datetime import datetime

from playwright.sync_api import sync_playwright, TimeoutError as PWTimeout


ORG_URL = "https://pomagam.pl/org/gieniutkowo"


@dataclass
class Campaign:
    slug:   str
    title:  str
    amount: int

    @property
    def url(self) -> str:
        return f"https://pomagam.pl/{self.slug}"


def scrape() -> list[Campaign]:
    slug_re   = re.compile(r"^(?:https?://pomagam\.pl)?/([a-z0-9]{6})$")
    amount_re = re.compile(r"([\d][\d\s\u00a0]*)\s*zł")

    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)
        page    = browser.new_page()

        page.goto(ORG_URL, wait_until="domcontentloaded", timeout=30_000)

        # Dismiss cookie banner if present
        try:
            page.click("text=Akceptuję", timeout=3_000)
        except PWTimeout:
            pass

        # Click "Zobacz więcej" until it disappears
        while True:
            try:
                btn = page.locator("text=Zobacz więcej").last
                btn.wait_for(state="visible", timeout=3_000)
                btn.scroll_into_view_if_needed()
                btn.click()
                page.wait_for_timeout(800)
            except PWTimeout:
                break

        campaigns: dict[str, Campaign] = {}

        for a in page.locator("a[href]").all():
            href = a.get_attribute("href") or ""
            m    = slug_re.match(href)
            if not m:
                continue
            slug = m.group(1)

            amt_m = amount_re.search(a.inner_text())
            if not amt_m:
                continue

            amount = int(re.sub(r"\D", "", amt_m.group(1)))
            if amount == 0:
                continue

            h4 = a.locator("h4").first
            try:
                title = h4.inner_text(timeout=500).strip()
            except PWTimeout:
                title = slug

            campaigns[slug] = Campaign(slug=slug, title=title, amount=amount)

        browser.close()

    return sorted(campaigns.values(), key=lambda c: c.amount, reverse=True)


if __name__ == "__main__":
    try:
        campaigns = scrape()
        total     = sum(c.amount for c in campaigns)

        result = {
            "scraped_at": datetime.now().isoformat(),
            "total":      total,
            "count":      len(campaigns),
            "campaigns":  [
                {"slug": c.slug, "title": c.title, "amount": c.amount, "url": c.url}
                for c in campaigns
            ],
        }

        print(json.dumps(result, ensure_ascii=False, indent=2))

    except Exception as e:
        error = {"error": str(e), "scraped_at": datetime.now().isoformat()}
        print(json.dumps(error))
        sys.exit(1)
