# EBookBuilder.java

    package com.university.bookstore.builder;

    import com.university.bookstore.model.EBook;
    import com.university.bookstore.model.Material;
    import com.university.bookstore.model.Media;

    /**
     * Builder for creating EBook instances with a fluent interface.
     * Demonstrates the Builder pattern for complex object construction.
     *
     * @author Navid Mohaghegh
     * @version 3.0
     * @since 2024-09-15
     */
    public class EBookBuilder implements MaterialBuilder<EBook> {

        private String id;
        private String title;
        private String author;
        private double price;
        private int year;
        private String fileFormat;
        private double fileSize;
        private boolean drmEnabled = false;
        private int wordCount;
        private Media.MediaQuality quality = Media.MediaQuality.MEDIUM;

        /**
         * Sets the eBook ID.
         *
         * @param id the eBook ID
         * @return this builder for method chaining
         */
        public EBookBuilder setId(String id) {
            this.id = id;
            return this;
        }

        /**
         * Sets the eBook title.
         *
         * @param title the eBook title
         * @return this builder for method chaining
         */
        public EBookBuilder setTitle(String title) {
            this.title = title;
            return this;
        }

        /**
         * Sets the eBook author.
         *
         * @param author the eBook author
         * @return this builder for method chaining
         */
        public EBookBuilder setAuthor(String author) {
            this.author = author;
            return this;
        }

        /**
         * Sets the eBook price.
         *
         * @param price the eBook price
         * @return this builder for method chaining
         */
        public EBookBuilder setPrice(double price) {
            this.price = price;
            return this;
        }

        /**
         * Sets the eBook publication year.
         *
         * @param year the publication year
         * @return this builder for method chaining
         */
        public EBookBuilder setYear(int year) {
            this.year = year;
            return this;
        }

        /**
         * Sets the eBook file format.
         *
         * @param fileFormat the file format (e.g., "EPUB", "PDF", "MOBI")
         * @return this builder for method chaining
         */
        public EBookBuilder setFileFormat(String fileFormat) {
            this.fileFormat = fileFormat;
            return this;
        }

        /**
         * Sets the eBook file size.
         *
         * @param fileSize the file size in MB
         * @return this builder for method chaining
         */
        public EBookBuilder setFileSize(double fileSize) {
            this.fileSize = fileSize;
            return this;
        }

        /**
         * Sets the DRM enabled status.
         *
         * @param drmEnabled true if DRM is enabled
         * @return this builder for method chaining
         */
        public EBookBuilder setDrmEnabled(boolean drmEnabled) {
            this.drmEnabled = drmEnabled;
            return this;
        }

        /**
         * Sets the eBook word count.
         *
         * @param wordCount the word count
         * @return this builder for method chaining
         */
        public EBookBuilder setWordCount(int wordCount) {
            this.wordCount = wordCount;
            return this;
        }

        /**
         * Sets the eBook quality.
         *
         * @param quality the media quality
         * @return this builder for method chaining
         */
        public EBookBuilder setQuality(Media.MediaQuality quality) {
            this.quality = quality;
            return this;
        }

        /**
         * Sets DRM enabled to true.
         *
         * @return this builder for method chaining
         */
        public EBookBuilder enableDRM() {
            this.drmEnabled = true;
            return this;
        }

        /**
         * Sets DRM enabled to false.
         *
         * @return this builder for method chaining
         */
        public EBookBuilder disableDRM() {
            this.drmEnabled = false;
            return this;
        }

        /**
         * Sets the quality to high.
         *
         * @return this builder for method chaining
         */
        public EBookBuilder setHighQuality() {
            this.quality = Media.MediaQuality.HIGH;
            return this;
        }

        /**
         * Sets the quality to low.
         *
         * @return this builder for method chaining
         */
        public EBookBuilder setLowQuality() {
            this.quality = Media.MediaQuality.LOW;
            return this;
        }

        @Override
        public EBook build() {
            validate();
            return new EBook(id, title, author, price, year, fileFormat,
                            fileSize, drmEnabled, wordCount, quality);
        }

        @Override
        public void validate() {
            if (id == null || id.trim().isEmpty()) {
                throw new IllegalStateException("ID is required");
            }
            if (title == null || title.trim().isEmpty()) {
                throw new IllegalStateException("Title is required");
            }
            if (author == null || author.trim().isEmpty()) {
                throw new IllegalStateException("Author is required");
            }
            if (price < 0) {
                throw new IllegalStateException("Price must be non-negative: " + price);
            }
            if (year < 1000 || year > 2100) {
                throw new IllegalStateException("Year must be between 1000 and 2100: " + year);
            }
            if (fileFormat == null || fileFormat.trim().isEmpty()) {
                throw new IllegalStateException("File format is required");
            }
            if (fileSize < 0) {
                throw new IllegalStateException("File size must be non-negative: " + fileSize);
            }
            if (wordCount < 0) {
                throw new IllegalStateException("Word count must be non-negative: " + wordCount);
            }
            if (quality == null) {
                throw new IllegalStateException("Quality is required");
            }
        }

        @Override
        public void reset() {
            this.id = null;
            this.title = null;
            this.author = null;
            this.price = 0.0;
            this.year = 0;
            this.fileFormat = null;
            this.fileSize = 0.0;
            this.drmEnabled = false;
            this.wordCount = 0;
            this.quality = Media.MediaQuality.MEDIUM;
        }

        /**
         * Gets the current ID.
         *
         * @return the current ID
         */
        public String getId() {
            return id;
        }

        /**
         * Gets the current title.
         *
         * @return the current title
         */
        public String getTitle() {
            return title;
        }

        /**
         * Gets the current author.
         *
         * @return the current author
         */
        public String getAuthor() {
            return author;
        }

        /**
         * Gets the current price.
         *
         * @return the current price
         */
        public double getPrice() {
            return price;
        }

        /**
         * Gets the current year.
         *
         * @return the current year
         */
        public int getYear() {
            return year;
        }

        /**
         * Gets the current file format.
         *
         * @return the current file format
         */
        public String getFileFormat() {
            return fileFormat;
        }

        /**
         * Gets the current file size.
         *
         * @return the current file size
         */
        public double getFileSize() {
            return fileSize;
        }

        /**
         * Gets the current DRM enabled status.
         *
         * @return the current DRM enabled status
         */
        public boolean isDrmEnabled() {
            return drmEnabled;
        }

        /**
         * Gets the current word count.
         *
         * @return the current word count
         */
        public int getWordCount() {
            return wordCount;
        }

        /**
         * Gets the current quality.
         *
         * @return the current quality
         */
        public Media.MediaQuality getQuality() {
            return quality;
        }

        @Override
        public String toString() {
            return String.format("EBookBuilder[ID=%s, Title=%s, Author=%s, Price=$%.2f, Year=%d, Format=%s, Size=%.2fMB, DRM=%s, Words=%d, Quality=%s]",
                id, title, author, price, year, fileFormat, fileSize, drmEnabled, wordCount, quality);
        }
    }