"""Apify Facebook Groups Scraper post source."""

from __future__ import annotations

import logging
from collections.abc import Iterator
from datetime import datetime

import httpx

from agent_samochodowy.config import Settings
from agent_samochodowy.ingestor.base import PostSource
from agent_samochodowy.models import Post

logger = logging.getLogger(__name__)

APIFY_BASE = "https://api.apify.com/v2"


class ApifySource(PostSource):
    """Fetch posts from Facebook groups via Apify actor."""

    def __init__(self, settings: Settings, group_urls: list[str]) -> None:
        self.token = settings.apify_token
        self.actor_id = settings.apify_actor_id
        self.group_urls = group_urls
        if not self.token:
            raise ValueError("APIFY_TOKEN not set")

    def fetch_posts(self) -> Iterator[Post]:
        """Run the Apify actor and yield posts."""
        with httpx.Client(timeout=120) as client:
            # Start actor run
            run = client.post(
                f"{APIFY_BASE}/acts/{self.actor_id}/runs",
                params={"token": self.token},
                json={
                    "startUrls": [{"url": u} for u in self.group_urls],
                    "resultsLimit": 100,
                    "sortBy": "New posts",
                },
            )
            run.raise_for_status()
            run_data = run.json().get("data", {})
            dataset_id = run_data.get("defaultDatasetId")

            if not dataset_id:
                logger.error("Apify run did not return a dataset ID")
                return

            # Wait for run to finish (simplified: poll status)
            run_id = run_data.get("id")
            logger.info("Apify run started: %s, dataset: %s", run_id, dataset_id)

            # Fetch results from dataset
            resp = client.get(
                f"{APIFY_BASE}/datasets/{dataset_id}/items",
                params={"token": self.token, "format": "json"},
            )
            resp.raise_for_status()
            items = resp.json()

            for item in items:
                post = self._map_to_post(item)
                if post:
                    yield post

    def _map_to_post(self, item: dict) -> Post | None:
        """Map Apify's output schema to Post."""
        try:
            return Post(
                post_id=str(item.get("postId", item.get("id", ""))),
                group=item.get("groupName", item.get("groupUrl", "")),
                author_name=item.get("authorName", item.get("user", {}).get("name", "Unknown")),
                author_profile_url=item.get("authorProfileUrl", item.get("user", {}).get("url", "")),
                text=item.get("text", item.get("message", "")),
                timestamp=item.get("timestamp", item.get("time", datetime.now().isoformat())),
                post_url=item.get("postUrl", item.get("url", "")),
            )
        except Exception as e:
            logger.warning("Failed to map Apify item: %s", e)
            return None
