"""cf scenario — применить именованный сценарий (baseline/optimistic/pessimistic).""" import typer from application.scenarios import DEFAULT_SCENARIOS from infrastructure.cli.i18n import t from infrastructure.cli.services import ( build_services, console, convert_value, fmt_amount, load_model, resolve_currency, ) app = typer.Typer() CURRENCY_OPTION = typer.Option(None, "--currency", "-c", help=t("cmd.forecast.opt.currency")) @app.command() def scenario( name: str = typer.Argument("baseline", help=t("cmd.scenario.arg.name")), months: int = typer.Option(12, "--months", "-m", help=t("cmd.scenario.opt.months")), currency: str | None = CURRENCY_OPTION, ) -> None: """Применить сценарий и показать прогноз""" model = load_model() target_curr, symbol = resolve_currency(model, currency) _, scenario_service, _, converter = build_services(model) base_curr = model.base_currency if name in DEFAULT_SCENARIOS: scenario_obj = DEFAULT_SCENARIOS[name] else: console.print(f"[red]{t('cmd.scenario.err.unknown', name=name)}[/red]") console.print(t("cmd.scenario.err.available", scenarios=", ".join(DEFAULT_SCENARIOS.keys()))) raise typer.Exit(1) result = scenario_service.apply(scenario_obj, months) balance = convert_value(converter, result["total_balance"], base_curr, target_curr) income = convert_value(converter, result["total_income"], base_curr, target_curr) expenses = convert_value(converter, result["total_expenses"], base_curr, target_curr) console.print(f"[bold]{t('cmd.scenario.label')}:[/bold] {result['scenario']}") console.print(f"[dim]{result['scenario_description']}[/dim]") console.print(f"{t('cmd.scenario.label.balance')}: {fmt_amount(balance, target_curr, symbol)}") console.print(f"{t('cmd.scenario.label.income')}: {fmt_amount(income, target_curr, symbol)}") console.print(f"{t('cmd.scenario.label.expenses')}: {fmt_amount(expenses, target_curr, symbol)}")