package library;

import java.time.LocalDate;
import java.util.ArrayList;

/** La biblioteca: conoce sus ejemplares y sus socios, y registra préstamos. */
public class Library {
    public static final int LOAN_DAYS = 14;

    private final ArrayList<Copy> copies = new ArrayList<>();
    private final ArrayList<Member> members = new ArrayList<>();

    public void addCopy(Copy copy) {
        copies.add(copy);
    }

    public void addMember(Member member) {
        members.add(member);
    }

    /** Busca un ejemplar por su código; null si no existe. */
    public Copy findCopy(String code) {
        for (Copy c : copies) {
            if (c.code().equals(code)) {
                return c;
            }
        }
        return null;
    }

    /** Cuántos ejemplares de ese libro están disponibles. */
    public int availableCopies(Book book) {
        int n = 0;
        for (Copy c : copies) {
            if (c.book().equals(book) && c.isAvailable()) {
                n++;
            }
        }
        return n;
    }

    /**
     * Presta un ejemplar disponible a un socio que todavía puede pedir libros.
     * El préstamo vence LOAN_DAYS días después de today.
     */
    public Loan lend(Copy copy, Member member, LocalDate today) {
        if (!copy.isAvailable()) {
            throw new IllegalArgumentException("el ejemplar " + copy.code() + " ya está prestado");
        }
        if (!member.canBorrow()) {
            throw new IllegalArgumentException(member.name() + " ya tiene " + Member.MAX_LOANS + " préstamos");
        }
        Loan loan = new Loan(copy, member, today.plusDays(LOAN_DAYS));
        copy.markOnLoan();
        member.addLoan(loan);
        return loan;
    }

    public void giveBack(Loan loan) {
        if (loan.isReturned()) {
            throw new IllegalArgumentException("el préstamo ya se devolvió");
        }
        loan.markReturned();
        loan.member().removeLoan(loan);
    }
}
