ProductAddView.java

package estore.presentation;

import estore.business.BookCreationRequest;
import estore.business.ElectronicsCreationRequest;
import estore.business.IProductService;
import estore.business.ProductFactory;
import estore.logging.ILogger;
import estore.presentation.validation.NameRule;
import estore.presentation.validation.PriceRule;
import estore.presentation.validation.ProductIDRule;
import estore.presentation.validation.YearRule;

public class ProductAddView {
    private final IProductService productService;
    private final IConsole console;
    private final ILogger logger;

    public ProductAddView(
            IProductService productService,
            IConsole console,
            ILogger logger) {
        this.productService = productService;
        this.console = console;
        this.logger = logger;
    }

    public void add() {
        logger.info("Starting product addition workflow");
        int option = -1;

        do {
            console.printPrompt(ConsolePrompts.PRODUCT_TYPE_MENU);
            option = Integer.parseInt(console.readInput());

            if (option != 1 && option != 2) {
                console.printMessage(ConsoleMessages.INVALID_OPTION);
                continue;
            }
        } while (option != 1 && option != 2);

        String productId = readProductId();
        int year = Integer.parseInt(console.readValidatedInput(
                ConsolePrompts.YEAR_PROMPT,
                new YearRule(),
                "Year has to be 4 digit"));

        String name = console.readValidatedInput(
                ConsolePrompts.NAME_PROMPT,
                new NameRule(),
                "User must input a name");

        String priceInput = console.readValidatedInput(
                ConsolePrompts.PRICE_PROMPT,
                new PriceRule(),
                "User must input decimal numbers");

        double price = priceInput.isEmpty() ? 0.0 : Double.parseDouble(priceInput);

        if (option == 1) {
            BookCreationRequest request = createBookCreationRequest(productId, year, name, price);
            logger.info("Adding book product with id=" + productId);
            productService.addProduct(ProductFactory.createProduct(request));
        }

        if (option == 2) {
            ElectronicsCreationRequest request = createElectronicsCreationRequest(productId, year, name, price);
            logger.info("Adding electronics product with id=" + productId);
            productService.addProduct(ProductFactory.createProduct(request));
        }
    }

    public BookCreationRequest createBookCreationRequest(String productId, int year, String name, double price) {
        String author = readAuthor();
        String publisher = readPublisher();
        return new BookCreationRequest(productId, name, price, year, author, publisher);
    }

    public ElectronicsCreationRequest createElectronicsCreationRequest(String productId, int year, String name,
            double price) {
        String maker = readMaker();
        return new ElectronicsCreationRequest(productId, name, price, year, maker);
    }

    private String readAuthor() {
        return readOptionalValue(ConsolePrompts.AUTHOR_PROMPT);
    }

    private String readPublisher() {
        return readOptionalValue(ConsolePrompts.PUBLISHER_PROMPT);
    }

    private String readMaker() {
        return readOptionalValue(ConsolePrompts.MAKER_PROMPT);
    }

    private String readOptionalValue(String prompt) {
        return console.readInput();
    }

    private String readProductId() {
        return console.readValidatedInput(
                ConsolePrompts.ID_PROMPT,
                new ProductIDRule(),
                "ID can only contain numbers of length 6");
    }
}