from decimal import Decimal

from invoicing.invoice import Invoice
from invoicing.lines import LineItem
from invoicing.report import render


def d(value: str) -> Decimal:
    return Decimal(value)


def test_single_currency_total() -> None:
    invoice = Invoice(
        "USD", [LineItem("widget", d("19.99"), 3), LineItem("gadget", d("5.00"), 2)]
    )
    assert invoice.total() == d("69.97")


def test_twenty_percent_tax() -> None:
    invoice = Invoice("USD", [LineItem("service", d("100.00"), 1)], tax_percent=d("20"))
    assert invoice.total() == d("120.00")


def test_multi_currency_total() -> None:
    # 100 USD is 91.95 EUR at the reference rates (1 EUR = 1.0875 USD).
    invoice = Invoice(
        "EUR",
        [
            LineItem("hosting", d("100.00"), 1, "USD"),
            LineItem("support", d("50.00"), 1, "EUR"),
        ],
    )
    assert invoice.total() == d("141.95")


def test_report_shows_the_total() -> None:
    invoice = Invoice("USD", [LineItem("widget", d("10.00"), 2)])
    assert render(invoice).splitlines()[-1].split() == ["Total", "20.00", "USD"]
