// Package: users
package users;
public class User {
    String name;
    int userID;
    public User(String name, int userID) { this.name = name; this.userID = userID; }
}

// Package: books
package books;
public class Book {
    String title;
    boolean isAvailable;
    public Book(String title) { this.title = title; this.isAvailable = true; }
}

// Package: exceptions
package exceptions;
public class BookNotAvailableException extends Exception {}
public class BookNotBorrowedException extends Exception {}
public class BookCannotBeIssued extends Exception {}

// Interface LibraryOperations
package users;
import books.Book;
import exceptions.*;
interface LibraryOperations {
    void borrowBook(Book book) throws BookNotAvailableException, BookCannotBeIssued;
    void returnBook(Book book) throws BookNotBorrowedException;
    int calculatePenalty(int daysLate);
}

// Class LibraryUser
package users;
import books.Book;
import exceptions.*;
public class LibraryUser extends User implements LibraryOperations {
    public LibraryUser(String name, int userID) { super(name, userID); }
    public void borrowBook(Book book) throws BookNotAvailableException, BookCannotBeIssued {
        if (!book.isAvailable) throw new BookNotAvailableException();
        book.isAvailable = false;
    }
    public void returnBook(Book book) throws BookNotBorrowedException {
        if (book.isAvailable) throw new BookNotBorrowedException();
        book.isAvailable = true;
    }
    public int calculatePenalty(int daysLate) { return daysLate * 2; }
}

// Main class for testing
package main;
import users.LibraryUser;
import books.Book;
import exceptions.*;
public class Main {
    public static void main(String[] args) {
        LibraryUser user = new LibraryUser("Alice", 1);
        Book book = new Book("Java Programming");
        try {
            user.borrowBook(book);
            user.returnBook(book);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
} 
