from __future__ import annotations

import argparse
import json
import os
from pathlib import Path
from typing import Any

from src.signals.tradingview import TradingViewWebhookConfig, handle_tradingview_payload


def _split_csv(values: list[str] | None, env_value: str | None = None) -> set[str]:
    items: list[str] = []
    for value in values or []:
        items.extend(part.strip() for part in value.split(","))
    if env_value:
        items.extend(part.strip() for part in env_value.split(","))
    return {item for item in items if item}


def _load_secret(args: argparse.Namespace) -> str:
    if args.secret:
        return args.secret
    if args.secret_file:
        return Path(args.secret_file).read_text(encoding="utf-8").strip()
    env_secret = os.environ.get("CTB_TRADINGVIEW_WEBHOOK_SECRET")
    if env_secret:
        return env_secret.strip()
    raise SystemExit("missing webhook secret: use --secret-file or CTB_TRADINGVIEW_WEBHOOK_SECRET")


def _load_payload(args: argparse.Namespace) -> dict[str, Any]:
    if args.payload_file:
        return json.loads(Path(args.payload_file).read_text(encoding="utf-8"))
    return json.loads(args.payload_json)


def build_parser() -> argparse.ArgumentParser:
    parser = argparse.ArgumentParser(description="Ingest a TradingView alert into the paper-only signal journal.")
    parser.add_argument("--payload-file")
    parser.add_argument("--payload-json", default="{}")
    parser.add_argument("--runtime-dir", default="runtime")
    parser.add_argument("--secret")
    parser.add_argument("--secret-file")
    parser.add_argument("--header-secret", help="Testing/local CLI equivalent of X-CTB-Webhook-Secret.")
    parser.add_argument("--allowed-strategy", action="append", default=[])
    parser.add_argument("--allowed-coin", action="append", default=[])
    parser.add_argument("--json", action="store_true")
    return parser


def main(argv: list[str] | None = None) -> int:
    parser = build_parser()
    args = parser.parse_args(argv)
    payload = _load_payload(args)
    allowed_strategies = _split_csv(args.allowed_strategy, os.environ.get("CTB_TRADINGVIEW_ALLOWED_STRATEGIES"))
    allowed_coins = {coin.upper() for coin in _split_csv(args.allowed_coin, os.environ.get("CTB_TRADINGVIEW_ALLOWED_COINS"))}
    if not allowed_strategies:
        raise SystemExit("missing allowed strategies")
    if not allowed_coins:
        raise SystemExit("missing allowed coins")
    cfg = TradingViewWebhookConfig(
        runtime_dir=Path(args.runtime_dir),
        secret=_load_secret(args),
        allowed_strategies=allowed_strategies,
        allowed_coins=allowed_coins,
    )
    headers = {}
    if args.header_secret:
        headers["X-CTB-Webhook-Secret"] = args.header_secret
    result = handle_tradingview_payload(payload, headers=headers, config=cfg)
    if args.json:
        print(json.dumps(result, indent=2, sort_keys=True))
    else:
        print(f"TradingView signal accepted={result.get('accepted')} reason={result.get('reason')}")
    return 0 if result.get("accepted") else 2


if __name__ == "__main__":
    raise SystemExit(main())
