from decimal import Decimal
from unittest.mock import MagicMock

import pytest

from app.core.exceptions import NotFoundError
from app.services.policy_service import PolicyService


def test_delete_payment_recalculates_policy():
    db = MagicMock()
    policy = MagicMock()
    policy.total_commission = Decimal("1000.00")
    payment = MagicMock()

    service = PolicyService(db)
    service.policies = MagicMock()
    service.policies.get_by_id = MagicMock(return_value=policy)
    service.payments = MagicMock()
    service.payments.get_by_id = MagicMock(return_value=payment)
    service.payments.sum_by_policy = MagicMock(return_value=Decimal("500.00"))

    service.delete_payment(agency_id=1, policy_id=10, payment_id=5)

    service.payments.delete.assert_called_once_with(payment)
    service.payments.recalculate_policy_payments.assert_called_once_with(policy, Decimal("500.00"))
    db.commit.assert_called_once()


def test_delete_payment_not_found():
    db = MagicMock()
    service = PolicyService(db)
    service.policies = MagicMock()
    service.policies.get_by_id = MagicMock(return_value=MagicMock())
    service.payments = MagicMock()
    service.payments.get_by_id = MagicMock(return_value=None)

    with pytest.raises(NotFoundError, match="Payment not found"):
        service.delete_payment(1, 10, 99)
