package invoice.after;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.List;

import org.junit.jupiter.api.Test;

class InvoiceServiceTest {

    private static Invoice sample() {
        Invoice invoice = new Invoice("alice");
        invoice.add("cuaderno", 3, 450);
        invoice.add("lapicero", 2, 150);
        return invoice;
    }

    @Test
    void totalIncludesTax() {
        Invoice invoice = sample();
        assertEquals(1650, invoice.subtotal());
        assertEquals(297, invoice.tax());
        assertEquals(1947, invoice.total());
    }

    @Test
    void formatterBuildsTheText() {
        String expected = """
                Factura para alice
                   3 x cuaderno     S/ 13.50
                   2 x lapicero     S/ 3.00
                Total con IGV: S/ 19.47
                """;
        assertEquals(expected, new InvoiceFormatter().format(sample()));
    }

    @Test
    void issueSendsOneDocumentToTheCustomer() {
        SpyChannel spy = new SpyChannel();
        InvoiceService service = new InvoiceService(new InvoiceFormatter(), spy);

        service.issue(sample());

        assertEquals(List.of("alice"), spy.recipients);
        assertEquals(new InvoiceFormatter().format(sample()), spy.texts.get(0));
    }
}
