package library.step1;

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

// Paso 1 · Rename: nombres que dicen qué guardan. Nada más cambió.
public class LibraryDesk {

    public String statement(Member member, List<Loan> loans) {
        String text = "Multas de " + member.name() + " (" + member.type() + ")\n";
        int total = 0;
        for (Loan loan : loans) {
            int daysLate = (int) ChronoUnit.DAYS.between(loan.due(), loan.returned());
            if (daysLate < 0) {
                daysLate = 0;
            }
            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;
            }
            total += fine;
            text += String.format("  %-18s %3d días  S/ %d.%02d\n", loan.title(), daysLate, fine / 100, fine % 100);
        }
        text += String.format("Total: S/ %d.%02d\n", total / 100, total % 100);
        return text;
    }

    public int totalFine(Member member, List<Loan> loans) {
        int total = 0;
        for (Loan loan : loans) {
            int daysLate = (int) ChronoUnit.DAYS.between(loan.due(), loan.returned());
            if (daysLate < 0) {
                daysLate = 0;
            }
            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;
            }
            total += fine;
        }
        return total;
    }
}
