"""Tests for CLI argument parsing and integration."""

from __future__ import annotations

import pytest

from sb_scout.cli import extract_cli_overrides, parse_args


class TestParseArgs:
    def test_defaults_are_none(self):
        args = parse_args([])
        assert args.top is None
        assert args.price_cap is None
        assert args.ecc_only is None
        assert args.active_profiles is None
        assert args.currency is None

    def test_cultscale_maps_to_active_profiles(self):
        args = parse_args(["--cultscale"])
        assert args.active_profiles == ["cultscale"]

    def test_profile_flag(self):
        args = parse_args(["--profile", "budget"])
        assert args.active_profiles == ["budget"]

    def test_multiple_profiles(self):
        args = parse_args(["--profile", "ecc", "--profile", "mixed-storage"])
        assert args.active_profiles == ["ecc", "mixed-storage"]

    def test_init_config(self):
        args = parse_args(["--init-config"])
        assert args.init_config is True

    def test_json_stdout(self):
        args = parse_args(["--json"])
        assert args.json_stdout is True

    def test_watch(self):
        args = parse_args(["--watch", "60"])
        assert args.watch == 60

    def test_ecc_exclusive(self):
        with pytest.raises(SystemExit):
            parse_args(["--only-ecc", "--include-non-ecc"])

    def test_alert_email_to_repeatable(self):
        args = parse_args(["--alert-email-to", "a@example.com", "--alert-email-to", "b@example.com"])
        assert args.alert_email_to == ["a@example.com", "b@example.com"]

    def test_currency_flag(self):
        args = parse_args(["--currency", "EUR"])
        assert args.currency == "EUR"


class TestExtractCliOverrides:
    def test_none_excluded(self):
        args = parse_args([])
        overrides = extract_cli_overrides(args)
        assert len(overrides) == 0

    def test_explicit_values_included(self):
        args = parse_args(["--top", "10", "--price-cap", "80"])
        overrides = extract_cli_overrides(args)
        assert overrides["top"] == 10
        assert overrides["price_cap"] == 80.0

    def test_ecc_only_flag(self):
        args = parse_args(["--only-ecc"])
        overrides = extract_cli_overrides(args)
        assert overrides["ecc_only"] is True

    def test_include_non_ecc(self):
        args = parse_args(["--include-non-ecc"])
        overrides = extract_cli_overrides(args)
        assert overrides["ecc_only"] is False

    def test_profiles_override_included(self):
        args = parse_args(["--profile", "ecc", "--profile", "mixed-storage"])
        overrides = extract_cli_overrides(args)
        assert overrides["active_profiles"] == ["ecc", "mixed-storage"]

    def test_alert_email_fields(self):
        args = parse_args([
            "--alert-email-to", "ops@example.com",
            "--alert-email-from", "bot@example.com",
            "--alert-email-subject", "Deals",
            "--alert-email-account", "default",
        ])
        overrides = extract_cli_overrides(args)
        assert overrides["alert_email_to"] == ["ops@example.com"]
        assert overrides["alert_email_from"] == "bot@example.com"
        assert overrides["alert_email_subject"] == "Deals"
        assert overrides["alert_email_account"] == "default"
