"""FRSME-MEI010 — IndicatorTarget revision tracking.

Asserts:
* ``original_target_value`` is frozen on first save where ``target_value`` is set.
* Subsequent target changes do not overwrite the original.
* simple-history captures the row at each save.
"""
from __future__ import annotations

from decimal import Decimal

import pytest
from django.contrib.auth import get_user_model
from django.utils import timezone

from apps.mel.indicators.models import (
    Indicator,
    IndicatorFrequency,
    IndicatorTarget,
    LogFrame,
    LogFrameLevel,
    LogFrameRow,
)

User = get_user_model()
pytestmark = pytest.mark.django_db


@pytest.fixture
def officer():
    return User.objects.create_user(
        email="mel-mei010@example.com", password="x", role="mel_officer",
    )


@pytest.fixture
def indicator(officer):
    lf = LogFrame.objects.create(name="LF-MEI010", slug="lf-mei010")
    row = LogFrameRow.objects.create(
        logframe=lf, level=LogFrameLevel.IMPACT, title="Test impact", order=0,
    )
    return Indicator.objects.create(
        logframe_row=row,
        code="i-mei010",
        name="Test indicator",
        unit="people",
        calculation_method="sum",
        data_source="manual",
        frequency=IndicatorFrequency.ANNUAL,
    )


def test_original_target_frozen_on_first_save_with_target(indicator):
    t = IndicatorTarget.objects.create(
        indicator=indicator,
        period_label="FY2026",
        period_start="2026-01-01",
        period_end="2026-12-31",
        baseline_value=Decimal("100"),
        target_value=Decimal("500"),
    )
    assert t.original_target_value == Decimal("500.0000")


def test_original_target_not_set_when_target_is_null(indicator):
    t = IndicatorTarget.objects.create(
        indicator=indicator,
        period_label="FY2027",
        period_start="2027-01-01",
        period_end="2027-12-31",
        baseline_value=Decimal("100"),
        target_value=None,
    )
    assert t.original_target_value is None


def test_original_target_locks_on_first_target_assignment(indicator):
    t = IndicatorTarget.objects.create(
        indicator=indicator,
        period_label="FY2028",
        period_start="2028-01-01",
        period_end="2028-12-31",
        baseline_value=Decimal("0"),
        target_value=None,
    )
    assert t.original_target_value is None
    t.target_value = Decimal("750")
    t.save()
    assert t.original_target_value == Decimal("750.0000")


def test_original_target_unchanged_after_revision(indicator):
    t = IndicatorTarget.objects.create(
        indicator=indicator,
        period_label="FY2029",
        period_start="2029-01-01",
        period_end="2029-12-31",
        baseline_value=Decimal("100"),
        target_value=Decimal("500"),
    )
    original = t.original_target_value
    t.target_value = Decimal("650")
    t.revision_reason = "Market shift — Q2 surge."
    t.revised_at = timezone.now()
    t.save()
    t.refresh_from_db()
    assert t.original_target_value == original
    assert t.target_value == Decimal("650.0000")
    assert t.revision_reason == "Market shift — Q2 surge."


def test_history_records_capture_revisions(indicator):
    t = IndicatorTarget.objects.create(
        indicator=indicator,
        period_label="FY2030",
        period_start="2030-01-01",
        period_end="2030-12-31",
        baseline_value=Decimal("100"),
        target_value=Decimal("400"),
    )
    t.target_value = Decimal("500")
    t.revision_reason = "Scope expanded."
    t.save()
    records = list(t.history.all().order_by("history_date"))
    assert len(records) >= 2
    # Latest record reflects new value.
    assert records[-1].target_value == Decimal("500.0000")
