package book.example.persistence.tests.builders;
import book.example.persistence.model.Address;
import book.example.persistence.model.AuctionSiteCredentials;
import book.example.persistence.model.Customer;
import book.example.persistence.model.PaymentMethod;
import java.util.HashSet;
import java.util.Set;
import static java.util.Arrays.asList;
import static java.util.Collections.emptySet;
public class CustomerBuilder extends AbstractBuilder<CustomerBuilder, Customer> {
private String name = "customer";
private String email = "customer@example.com";
private Builder<Address> addressBuilder = new AddressBuilder();
private Set<Builder<? extends PaymentMethod>> paymentMethods = emptySet();
private Set<Builder<? extends AuctionSiteCredentials>> auctionSitesUsed = emptySet();
public static CustomerBuilder aCustomer() {
return new CustomerBuilder();
}
public Customer build() {
return new Customer(name, email, addressBuilder.build(), buildSet(paymentMethods), buildSet(auctionSitesUsed));
}
public CustomerBuilder withName(String name) {
CustomerBuilder other = this.clone();
other.name = name;
return other;
}
public CustomerBuilder withEmailAddress(String email) {
CustomerBuilder other = this.clone();
other.email = email;
return other;
}
public CustomerBuilder withAddress(Builder<Address> addressBuilder) {
CustomerBuilder other = this.clone();
other.addressBuilder = addressBuilder;
return other;
}
public CustomerBuilder withPaymentMethods(Builder<? extends PaymentMethod>... paymentMethodBuilders) {
CustomerBuilder other = this.clone();
other.paymentMethods = setOf(paymentMethodBuilders);
return other;
}
public CustomerBuilder usingAuctionSites(Builder<AuctionSiteCredentials>... auctionSiteLoginBuilders) {
CustomerBuilder other = this.clone();
other.auctionSitesUsed = setOf(auctionSiteLoginBuilders);
return other;
}
private <T> HashSet<Builder<? extends T>> setOf(Builder<? extends T>... builders) {
return new HashSet<Builder<? extends T>>(asList(builders));
}
private static <T> Set<T> buildSet(Set<Builder<? extends T>> builders) {
HashSet<T> set = new HashSet<T>();
for (Builder<? extends T> builder : builders) {
set.add(builder.build());
}
return set;
}
}