package invoice.before;

import java.util.ArrayList;
import java.util.List;

// Una factura que hace de todo: guarda las líneas, calcula el IGV, arma el
// texto y lo imprime. Tiene tres razones para cambiar (ver la semana 13).
public class Invoice {

    private record Line(String description, int quantity, int unitPrice) {
    }

    private final String customer;
    private final List<Line> lines = new ArrayList<>();

    public Invoice(String customer) {
        this.customer = customer;
    }

    public void add(String description, int quantity, int unitPrice) {
        lines.add(new Line(description, quantity, unitPrice));
    }

    // Razón 1: las reglas del negocio (el IGV es 18 %).
    public int total() {
        int subtotal = 0;
        for (Line line : lines) {
            subtotal += line.quantity() * line.unitPrice();
        }
        return subtotal + (subtotal * 18 + 50) / 100;
    }

    // Razón 2: el diseño del documento.
    public String format() {
        StringBuilder text = new StringBuilder("Factura para " + customer + "\n");
        for (Line line : lines) {
            int amount = line.quantity() * line.unitPrice();
            text.append(String.format("  %2d x %-12s S/ %d.%02d\n",
                    line.quantity(), line.description(), amount / 100, amount % 100));
        }
        int total = total();
        text.append(String.format("Total con IGV: S/ %d.%02d\n", total / 100, total % 100));
        return text.toString();
    }

    // Razón 3: a dónde va la factura.
    public void print() {
        System.out.print(format());
    }
}
