package library.step2;

import java.time.temporal.ChronoUnit;
import java.util.List;

// Paso 2 · Extract Function: el cálculo de una multa y el formato del dinero
// tienen nombre y viven en un solo lugar. Se acabó el código duplicado.
public class LibraryDesk {

    public String statement(Member member, List<Loan> loans) {
        String text = "Multas de " + member.name() + " (" + member.type() + ")\n";
        for (Loan loan : loans) {
            text += String.format("  %-18s %3d días  %s\n",
                    loan.title(), daysLate(loan), money(fineFor(member, loan)));
        }
        return text + "Total: " + money(totalFine(member, loans)) + "\n";
    }

    public int totalFine(Member member, List<Loan> loans) {
        int total = 0;
        for (Loan loan : loans) {
            total += fineFor(member, loan);
        }
        return total;
    }

    private int fineFor(Member member, Loan loan) {
        int daysLate = daysLate(loan);
        int fine = 0;
        switch (member.type()) {
            case STUDENT:
                if (daysLate > 2) {
                    fine = (daysLate - 2) * (loan.kind() == ItemKind.DVD ? 100 : 50);
                }
                if (fine > 1000) {
                    fine = 1000;
                }
                break;
            case TEACHER:
                if (loan.kind() == ItemKind.DVD) {
                    fine = daysLate * 100;
                }
                break;
            case VISITOR:
                fine = daysLate * (loan.kind() == ItemKind.DVD ? 100 : 50) * 2;
                break;
        }
        return fine;
    }

    private int daysLate(Loan loan) {
        int days = (int) ChronoUnit.DAYS.between(loan.due(), loan.returned());
        return Math.max(days, 0);
    }

    private static String money(int cents) {
        return String.format("S/ %d.%02d", cents / 100, cents % 100);
    }
}
