"""Pasaulio tendencijų rinkimo sistema – paleidimo taškas.

Naudojimas:
    python -m trends_collector.main init-db             # sukurti schemą + įvardinti šalis
    python -m trends_collector.main run-once            # vienkartinis paleidimas (3-5 šalims)
    python -m trends_collector.main run                 # pastovus veikimas su scheduleriu
    python -m trends_collector.main export              # CSV/JSON eksportas dabar
    python -m trends_collector.main dashboard           # paleidžia web UI
"""

from __future__ import annotations

import argparse
import signal
import sys
import time

from .config import load_config
from .countries import seed_countries
from .database import DatabaseHandler
from .exporters.csv_json import export_all
from .logger import setup_logging, get_logger
from .scheduler import build_and_start


def cmd_init_db(args, cfg, db) -> int:
    db.create_schema()
    seed_countries(db)
    return 0


def cmd_run_once(args, cfg, db) -> int:
    build_and_start(cfg, db, run_once=True)
    return 0


def cmd_run(args, cfg, db) -> int:
    log = get_logger(__name__)
    sched = build_and_start(cfg, db, run_once=False)
    if sched is None:
        log.error("Scheduler nepavyko paleisti")
        return 1

    stop = {"flag": False}
    def _handler(signum, frame):
        log.info("Gautas signalas %s, stojam.", signum)
        stop["flag"] = True
    signal.signal(signal.SIGINT, _handler)
    signal.signal(signal.SIGTERM, _handler)

    log.info("Trendų rinkimas paleistas. Spauskite Ctrl+C kad sustabdyti.")
    while not stop["flag"]:
        time.sleep(1.0)
    sched.shutdown(wait=False)
    return 0


def cmd_export(args, cfg, db) -> int:
    export_all(db, directory=cfg.export.get("directory", "exports"),
               formats=cfg.export.get("formats", ["json", "csv"]),
               hours=args.hours)
    return 0


def cmd_dashboard(args, cfg, db) -> int:
    import uvicorn
    from dashboard.app import create_app
    app = create_app(cfg, db)
    host = cfg.dashboard.get("host", "0.0.0.0")
    port = int(cfg.dashboard.get("port", 8080))
    uvicorn.run(app, host=host, port=port, log_level="info")
    return 0


def main() -> int:
    parser = argparse.ArgumentParser(description="Pasaulio tendencijų rinkimo sistema")
    parser.add_argument("--config", default="config.yaml", help="Konfigūracijos kelias")
    sub = parser.add_subparsers(dest="cmd", required=True)
    sub.add_parser("init-db", help="Sukurti DB schemą ir užpildyti countries")
    sub.add_parser("run-once", help="Paleisti visus kolektorius vienąkart")
    sub.add_parser("run", help="Paleisti su periodine planuokle")
    e = sub.add_parser("export", help="Eksportuoti CSV/JSON dabar")
    e.add_argument("--hours", type=int, default=24, help="Įtraukti įrašus, atnaujintus per X val.")
    sub.add_parser("dashboard", help="Paleisti FastAPI dashboard")

    args = parser.parse_args()
    cfg = load_config(args.config)

    setup_logging(
        level=cfg.logging_cfg.get("level", "INFO"),
        logfile=cfg.logging_cfg.get("file", "logs/trends.log"),
        rotate_mb=int(cfg.logging_cfg.get("rotate_mb", 50)),
        backup_count=int(cfg.logging_cfg.get("backup_count", 5)),
    )
    log = get_logger("main")
    log.info("Konfigūracija užkrauta iš %s", args.config)

    try:
        db = DatabaseHandler(cfg.db)
    except Exception as exc:
        log.error("DB sujungimas nepavyko: %s", exc)
        return 2

    handlers = {
        "init-db":   cmd_init_db,
        "run-once":  cmd_run_once,
        "run":       cmd_run,
        "export":    cmd_export,
        "dashboard": cmd_dashboard,
    }
    return handlers[args.cmd](args, cfg, db)


if __name__ == "__main__":
    sys.exit(main())
