package service;

import model.Book;
import model.Loan;
import model.Member;
import repository.BookRepository;
import repository.MemberRepository;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

public class LoanService {
    private final BookRepository bookRepo;
    private final MemberRepository memberRepo;
    private final List<Loan> loans = new ArrayList<>();

    public LoanService(BookRepository bookRepo, MemberRepository memberRepo) {
        this.bookRepo = bookRepo;
        this.memberRepo = memberRepo;
    }

    public String borrowBook(String bookId, String memberId) {
        Optional<Book> book = bookRepo.findById(bookId);
        Optional<Member> member = memberRepo.findById(memberId);

        if (book.isEmpty()) return "Book not found: " + bookId;
        if (member.isEmpty()) return "Member not found: " + memberId;
        if (!book.get().isAvailable()) return "Book is currently unavailable.";

        book.get().setAvailable(false);
        String loanId = "L" + UUID.randomUUID().toString().substring(0, 6).toUpperCase();
        loans.add(new Loan(loanId, book.get(), member.get()));
        return "Borrowed successfully. Loan ID: " + loanId;
    }

    public String returnBook(String loanId) {
        Optional<Loan> loan = loans.stream()
            .filter(l -> l.getId().equals(loanId) && !l.isReturned())
            .findFirst();

        if (loan.isEmpty()) return "Active loan not found: " + loanId;
        loan.get().returnBook();
        return "Book returned successfully.";
    }

    public List<Loan> getActiveLoans() {
        return loans.stream().filter(l -> !l.isReturned()).toList();
    }
}
