"""Bazinė kolektoriaus klasė ir TrendItem dataclass.

Kiekvienas konkretus kolektorius paveldi `BaseCollector` ir įgyvendina
`collect_for_country(country)`, kuris grąžina `TrendItem` sąrašą.
Kolektoriai NETURI tiesiogiai rašyti į DB – tą daro pipeline (pipeline.py),
kuris pritaiko valymą / kategorijas / sentimentą / deduplikaciją.
"""

from __future__ import annotations

import abc
import datetime as dt
from dataclasses import dataclass, field
from typing import List, Optional

from ..database import Country, DatabaseHandler
from ..logger import get_logger
from ..utils.http import HttpClient


@dataclass
class TrendItem:
    keyword: str                              # nevalytas raktažodis
    trend_type: str = "daily"                 # realtime|hourly|daily
    category: Optional[str] = None            # šaltinio pateikta, jei žino
    language: Optional[str] = None            # ISO 639-1 kodas
    rank: Optional[int] = None                # 1..N (jei šaltinis nurodo)
    score: Optional[float] = None             # 0..1 (jei šaltinis nurodo)
    volume: Optional[int] = None              # paieškų / paminėjimų skaičius
    description: Optional[str] = None
    url: Optional[str] = None
    detected_at: dt.datetime = field(default_factory=dt.datetime.utcnow)


class BaseCollector(abc.ABC):
    name: str = "base"
    source_type: str = "generic"

    def __init__(self, *, db: DatabaseHandler, http: HttpClient, cfg: dict):
        self.db = db
        self.http = http
        self.cfg = cfg
        self.log = get_logger(f"collector.{self.name}")

    @abc.abstractmethod
    def collect_for_country(self, country: Country) -> List[TrendItem]:
        """Grąžina TrendItem sąrašą duotos šalies. Nesilieja į DB."""
        ...

    # ---- pagalbinis: užregistruoja šaltinį, grąžina id ---------------------
    def ensure_source(self, country: Country, *, name_suffix: str = "",
                      url: Optional[str] = None) -> int:
        nm = f"{self.name}{(' / ' + name_suffix) if name_suffix else ''}"
        src = self.db.upsert_source(source_name=nm, source_type=self.source_type,
                                    url=url, country_id=country.id)
        return src.id
