package io.codearte.jfairy.producer.person;
import com.google.inject.assistedinject.Assisted;
import io.codearte.jfairy.data.DataMaster;
import io.codearte.jfairy.producer.BaseProducer;
import io.codearte.jfairy.producer.DateProducer;
import io.codearte.jfairy.producer.TimeProvider;
import io.codearte.jfairy.producer.company.Company;
import io.codearte.jfairy.producer.company.CompanyFactory;
import org.apache.commons.lang3.RandomStringUtils;
import org.joda.time.DateTime;
import org.joda.time.Years;
import javax.inject.Inject;
import static org.apache.commons.lang3.StringUtils.lowerCase;
import static org.apache.commons.lang3.StringUtils.stripAccents;
public class DefaultPersonProvider implements PersonProvider {
protected Person.Sex sex;
protected String telephoneNumberFormat;
protected Integer age;
protected DateTime dateOfBirth;
protected Company company;
protected Address address;
protected String firstName;
protected String middleName;
protected String lastName;
protected String email;
protected String username;
protected String telephoneNumber;
protected String password;
protected String companyEmail;
protected String nationalIdentityCardNumber;
protected String nationalIdentificationNumber;
protected String passportNumber;
protected final DataMaster dataMaster;
protected final DateProducer dateProducer;
protected final BaseProducer baseProducer;
protected final NationalIdentificationNumberFactory nationalIdentificationNumberFactory;
protected final NationalIdentityCardNumberProvider nationalIdentityCardNumberProvider;
protected final AddressProvider addressProvider;
protected final CompanyFactory companyFactory;
protected final TimeProvider timeProvider;
protected final PassportNumberProvider passportNumberProvider;
@Inject
public DefaultPersonProvider(DataMaster dataMaster,
DateProducer dateProducer,
BaseProducer baseProducer,
NationalIdentificationNumberFactory nationalIdentificationNumberFactory,
NationalIdentityCardNumberProvider nationalIdentityCardNumberProvider,
AddressProvider addressProvider,
CompanyFactory companyFactory,
PassportNumberProvider passportNumberProvider,
TimeProvider timeProvider,
@Assisted PersonProperties.PersonProperty... personProperties) {
this.dataMaster = dataMaster;
this.dateProducer = dateProducer;
this.baseProducer = baseProducer;
this.nationalIdentificationNumberFactory = nationalIdentificationNumberFactory;
this.nationalIdentityCardNumberProvider = nationalIdentityCardNumberProvider;
this.addressProvider = addressProvider;
this.passportNumberProvider = passportNumberProvider;
this.companyFactory = companyFactory;
this.timeProvider = timeProvider;
for (PersonProperties.PersonProperty personProperty : personProperties) {
personProperty.apply(this, baseProducer);
}
}
@Override
public Person get() {
generateSex();
generateCompany();
generateFirstName();
generateMiddleName();
generateLastName();
generateEmail();
generateUsername();
generateTelephoneNumber();
generateAge();
generateDateOfBirth();
generateCompanyEmail();
generatePassword();
generateNationalIdentityCardNumber();
generateNationalIdentificationNumber();
generatePassportNumber();
generateAddress();
return new Person(firstName, middleName, lastName, address, email,
username, password, sex, telephoneNumber, dateOfBirth, age,
nationalIdentityCardNumber, nationalIdentificationNumber, passportNumber,
company, companyEmail);
}
@Override
public void generateSex() {
if (sex != null) {
return;
}
sex = baseProducer.trueOrFalse() ? Person.Sex.MALE : Person.Sex.FEMALE;
}
@Override
public void generateCompany() {
if (company != null) {
return;
}
company = companyFactory.produceCompany().get();
}
@Override
public void generateFirstName() {
if (firstName != null) {
return;
}
firstName = dataMaster.getValuesOfType(FIRST_NAME, sex.name());
}
@Override
public void generateMiddleName() {
if (middleName != null) {
return;
}
middleName = baseProducer.trueOrFalse() ? dataMaster.getValuesOfType(FIRST_NAME, sex.name()) : "";
}
@Override
public void generateLastName() {
if (lastName != null) {
return;
}
lastName = dataMaster.getValuesOfType(LAST_NAME, sex.name());
}
@Override
public void generateEmail() {
if (email != null) {
return;
}
EmailProvider emailProvider = new EmailProvider(dataMaster, baseProducer, firstName, lastName);
email = emailProvider.get();
}
@Override
public void generateUsername() {
if (username != null) {
return;
}
if (baseProducer.trueOrFalse()) {
username = lowerCase(stripAccents(firstName.substring(0, 1) + lastName));
} else {
username = lowerCase(stripAccents(firstName + lastName.substring(0, 1)));
}
}
@Override
public void generateTelephoneNumber() {
if (telephoneNumber != null) {
return;
}
if (telephoneNumberFormat == null) {
telephoneNumberFormat = dataMaster.getRandomValue(TELEPHONE_NUMBER_FORMATS);
}
telephoneNumber = baseProducer.numerify(telephoneNumberFormat);
}
@Override
public void generateAge() {
if (dateOfBirth != null) {
age = Years.yearsBetween(dateOfBirth, DateTime.now()).getYears();
} else {
if (age != null) {
return;
}
age = baseProducer.randomBetween(MIN_AGE, MAX_AGE);
}
}
@Override
public void generateDateOfBirth() {
if (dateOfBirth != null) {
return;
}
DateTime maxDate = timeProvider.getCurrentDate().minusYears(age);
DateTime minDate = maxDate.minusYears(1).plusDays(1);
dateOfBirth = dateProducer.randomDateBetweenTwoDates(minDate, maxDate);
}
@Override
public void generateCompanyEmail() {
if (companyEmail != null) {
return;
}
CompanyEmailProvider companyEmailProvider = new CompanyEmailProvider(firstName, lastName, company);
companyEmail = companyEmailProvider.get();
}
@Override
public void generatePassword() {
if (password != null) {
return;
}
// FIXME: Replace this with baseProducer
password = RandomStringUtils.randomAlphanumeric(8);
}
@Override
public void generateNationalIdentityCardNumber() {
if (nationalIdentityCardNumber != null) {
return;
}
nationalIdentityCardNumber = nationalIdentityCardNumberProvider.get();
}
@Override
public void generateNationalIdentificationNumber() {
if (nationalIdentificationNumber != null) {
return;
}
nationalIdentificationNumber = nationalIdentificationNumberFactory.produceNationalIdentificationNumberProvider(
NationalIdentificationNumberProperties.dateOfBirth(dateOfBirth),
NationalIdentificationNumberProperties.sex(sex)).get().getValue();
}
@Override
public void generateAddress() {
if (address != null) {
return;
}
address = addressProvider.get();
}
@Override
public void generatePassportNumber() {
if (passportNumber != null) {
return;
}
passportNumber = passportNumberProvider.get();
}
@Override
public void setTelephoneNumberFormat(String telephoneFormat) {
telephoneNumberFormat = telephoneFormat;
}
@Override
public void setSex(Person.Sex sex) {
this.sex = sex;
}
@Override
public void setAge(int age) {
this.age = age;
}
@Override
public void setCompany(Company company) {
this.company = company;
}
@Override
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@Override
public void setMiddleName(String middleName) {
this.middleName = middleName;
}
@Override
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public void setEmail(String email) {
this.email = email;
}
@Override
public void setUsername(String username) {
this.username = username;
}
@Override
public void setTelephoneNumber(String telephoneNumber) {
this.telephoneNumber = telephoneNumber;
}
@Override
public void setDateOfBirth(DateTime dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
@Override
public void setPassword(String password) {
this.password = password;
}
@Override
public void setAddress(Address address) {
this.address = address;
}
@Override
public void setCompanyEmail(String companyEmail) {
this.companyEmail = companyEmail;
}
@Override
public void setNationalIdentityCardNumber(String nationalIdentityCardNumber) {
this.nationalIdentityCardNumber = nationalIdentityCardNumber;
}
@Override
public void setNationalIdentificationNumber(String nationalIdentificationNumber) {
this.nationalIdentificationNumber = nationalIdentificationNumber;
}
@Override
public void setPassportNumber(String passportNumber) {
this.passportNumber = passportNumber;
}
}