"""Scraperレジストリ。スクリプト定義と固有パラメータ組立を集約する。"""
from __future__ import annotations

import json
from dataclasses import dataclass, field
from pathlib import Path
from typing import Any, Callable, Dict, List, Optional


@dataclass
class ScraperDef:
    name: str
    dir: str
    script: str
    status_file: str
    log_file: str
    pid_file: str
    otp_file: str
    config_file: str
    screenshots_dir: str
    downloads_dir: str
    env_passthrough: List[str] = field(default_factory=list)
    argv_builder: Optional[Callable[[Dict[str, Any]], List[str]]] = None
    config_writer: Optional[Callable[[Dict[str, Any], Path], None]] = None

    def path(self, rel: str) -> Path:
        return Path(self.dir) / rel


def _write_amazon_associates_config(body: Dict[str, Any], cfg_path: Path) -> None:
    headless = bool(body.get("headless", True))
    period = body.get("period")
    if period is None:
        period = str(int(body.get("date_range", 30)))
    cfg = {
        "headless": headless,
        "report_type": body.get("report_type", "summary"),
        "period": str(period),
        "date_range": int(body.get("date_range", 30)),
        "target_tracking_ids": body.get("target_tracking_ids") or [],
    }
    cfg_path.parent.mkdir(parents=True, exist_ok=True)
    cfg_path.write_text(
        json.dumps(cfg, ensure_ascii=False, indent=2),
        encoding="utf-8",
    )


SCRAPERS: Dict[str, ScraperDef] = {
    "amazon-associates": ScraperDef(
        name="amazon-associates",
        dir="/app/python/amazon-associates",
        script="amazon_associates.py",
        status_file="storage/amazon_associates_status.json",
        log_file="storage/amazon_associates.log",
        pid_file="storage/amazon_associates.pid",
        otp_file="storage/otp_input.txt",
        config_file="storage/amazon_associates_config.json",
        screenshots_dir="storage/screenshots",
        downloads_dir="storage/downloads",
        env_passthrough=[
            "AMAZON_EMAIL", "AMAZON_PASSWORD", "INTERNAL_API_TOKEN",
            "DB_HOST", "DB_PORT", "DB_DATABASE", "DB_USERNAME", "DB_PASSWORD",
            "DISPLAY", "HOME", "PATH", "TZ",
            "CHROME_BIN", "CHROMEDRIVER_PATH",
        ],
        argv_builder=lambda body: ["--gui"] if not body.get("headless", True) else [],
        config_writer=_write_amazon_associates_config,
    ),
}


def get(name: str) -> ScraperDef:
    if name not in SCRAPERS:
        raise KeyError(name)
    return SCRAPERS[name]
