"""Снятие доходных планок при закрытии месяца. Без сети."""
import datetime
import sys
import core
import plan_sync as ps


def _plan_op(slug, mm, value, id_):
    return {"id": id_, "isPlan": 1, "group": "income", "value": value,
            "factMonth": mm, "externalId": "plansync:income:%s:%s" % (mm, slug)}


def test_income_plans_takes_only_target_month():
    ops = [_plan_op("uroki", "07.2026", 100, 1),
           _plan_op("uroki", "08.2026", 200, 2)]
    got = ps.income_plans(ops, "07.2026")
    assert [t["id"] for t in got] == [1]


def test_income_plans_ignores_facts_and_outcome_plans():
    fact = {"id": 3, "isPlan": 0, "group": "income", "factMonth": "07.2026",
            "externalId": "plansync:income:07.2026:uroki"}
    outcome = {"id": 4, "isPlan": 1, "group": "outcome", "factMonth": "07.2026",
               "externalId": "plansync:sync:07.2026:internet"}
    got = ps.income_plans([fact, outcome, _plan_op("hor", "07.2026", 50, 5)], "07.2026")
    assert [t["id"] for t in got] == [5]


def test_income_summary_pairs_plan_with_crm_fact(monkeypatch):
    import income_lines as il
    monkeypatch.setattr(il, "crm_fact", lambda mm, token=None: {"uroki": 2_994_085.0, "hor": 222_499.0})
    ops = [_plan_op("uroki", "07.2026", 2_400_000, 1), _plan_op("hor", "07.2026", 200_000, 2)]
    res = ps.income_summary("07.2026", ops)
    assert res["uroki"]["delta"] == 594_085.0
    assert res["hor"]["delta"] == 22_499.0


def test_income_summary_keeps_lines_without_plan(monkeypatch):
    """Факт есть, плана не было (напр. prochee) — строка не теряется, план 0."""
    import income_lines as il
    monkeypatch.setattr(il, "crm_fact", lambda mm, token=None: {"prochee": 15_000.0})
    res = ps.income_summary("07.2026", [])
    assert res["prochee"]["plan"] == 0.0
    assert res["prochee"]["fact"] == 15_000.0


def test_retire_target_month_uses_month_flag():
    """--month задан → снимаем указанный месяц как есть, а не «прошлый от него»."""
    got = ps.retire_target_month(["--retire-income", "--month", "07.2026"], "07.2026",
                                  datetime.date(2026, 7, 31))
    assert got == "07.2026"


def test_retire_target_month_defaults_to_previous():
    """Без --month — прошлый месяц от сегодняшней даты (таймер 1-го числа)."""
    got = ps.retire_target_month(["--retire-income"], "08.2026", datetime.date(2026, 7, 31))
    assert got == "06.2026"


def test_retire_income_fetches_operations_for_target_months_year(monkeypatch):
    """Находка #1: 1 января снимаемый месяц — декабрь ПРОШЛОГО года (prev="12.2025"),
    а core.ft_transactions() без year тянет за FIN_YEAR (текущий, 2026) — декабрьские
    планки молча не попадут в выборку. Проверяем, что год берётся из prev, а не из умолчания."""
    calls = {}

    def fake_ft_transactions(year=None, **pp):
        calls["year"] = year
        calls["group"] = pp.get("group")
        return []

    monkeypatch.setattr(core, "ft_transactions", fake_ft_transactions)
    import income_lines as il
    monkeypatch.setattr(il, "crm_fact", lambda mm, token=None: {})
    monkeypatch.setattr(sys, "argv", ["plan_sync.py", "--retire-income", "--month", "12.2025"])

    ps.main()

    assert calls["year"] == 2025
    assert calls["group"] == "income"
