"""Eksportas į CSV/JSON failus."""

from __future__ import annotations

import csv
import datetime as dt
import json
from pathlib import Path
from typing import List

from ..database import DatabaseHandler
from ..logger import get_logger

log = get_logger(__name__)


def _serialize(t) -> dict:
    return {
        "id": t.id,
        "country_id": t.country_id,
        "source_id": t.source_id,
        "category": t.category,
        "keyword": t.keyword,
        "keyword_raw": t.keyword_raw,
        "language": t.language,
        "score": float(t.score) if t.score is not None else None,
        "volume": t.volume,
        "sentiment": float(t.sentiment) if t.sentiment is not None else None,
        "trend_type": t.trend_type,
        "first_seen": t.first_seen.isoformat() if t.first_seen else None,
        "last_updated": t.last_updated.isoformat() if t.last_updated else None,
        "description": t.description,
        "url": t.url,
    }


def export_all(db: DatabaseHandler, directory: str = "exports",
               formats: List[str] | None = None, hours: int = 24) -> List[str]:
    formats = formats or ["json", "csv"]
    out_dir = Path(directory)
    out_dir.mkdir(parents=True, exist_ok=True)

    rows = [_serialize(t) for t in db.all_recent_trends(hours=hours, limit=10000)]
    timestamp = dt.datetime.utcnow().strftime("%Y%m%dT%H%M%SZ")
    paths: List[str] = []

    if "json" in formats:
        p = out_dir / f"trends_{timestamp}.json"
        with p.open("w", encoding="utf-8") as f:
            json.dump(rows, f, ensure_ascii=False, indent=2)
        paths.append(str(p))

    if "csv" in formats:
        p = out_dir / f"trends_{timestamp}.csv"
        if rows:
            with p.open("w", encoding="utf-8", newline="") as f:
                w = csv.DictWriter(f, fieldnames=list(rows[0].keys()))
                w.writeheader()
                w.writerows(rows)
        else:
            p.write_text("", encoding="utf-8")
        paths.append(str(p))

    log.info("Eksportuota %d įrašų į %s", len(rows), ", ".join(paths))
    return paths
