import Employee.Employee;
import com.google.common.collect.Lists;
import java.util.List;
public class Company {
private final int numberOfEmployees;
private final int salaryDifference;
private int toKeep =1;
private Company(Builder builder) {
this.numberOfEmployees = builder.numberOfEmployees;
this.salaryDifference = builder.salaryDifference;
}
public void addManager(Employee employee) {
}
public int employeesToKeep() {
return toKeep;
}
private static final class SalaryData {
private int s0;
private int as;
private int cs;
private int rs;
public SalaryData(int s0, int as, int cs, int rs) {
this.s0 = s0;
this.as = as;
this.cs = cs;
this.rs = rs;
}
}
private static final class ManagerData {
private int m0;
private int am;
private int cm;
private int rm;
public ManagerData(int m0, int am, int cm, int rm) {
this.m0 = m0;
this.am = am;
this.cm = cm;
this.rm = rm;
}
}
public static final class Builder {
private final int numberOfEmployees;
private final int salaryDifference;
private SalaryData salaryData = new SalaryData(0, 0, 0, 0);
private ManagerData managerData = new ManagerData(0, 0, 0, 0);
private Builder(int numberOfEmployees, int salaryDifference) {
this.numberOfEmployees = numberOfEmployees;
this.salaryDifference = salaryDifference;
}
public static Builder aCompanyBuilder(int numberOfEmployees, int salaryDifference) {
return new Builder(numberOfEmployees, salaryDifference);
}
public Builder withSalaryData(int s0, int as, int cs, int rs) {
this.salaryData = new SalaryData(s0, as, cs, rs);
return this;
}
public Builder withManagerData(int m0, int am, int cm, int rm) {
this.managerData = new ManagerData(m0, am, cm, rm);
return this;
}
public Company build() {
List<Employee> employees = Lists.newArrayList();
employees.add(new Employee(0, salaryData.s0,0,managerData.m0));
for (int employeeId = 1; employeeId < numberOfEmployees; employeeId++) {
Employee previousEmployee = employees.get(employeeId-1);
int salary = (previousEmployee.salary() * salaryData.as + salaryData.cs) % salaryData.rs;
int mi = ((previousEmployee.getM()* managerData.am + managerData.cm) % managerData.rm);
int manager = mi%employeeId;
employees.get(manager).addDirectReport(employeeId);
Employee currentEmployee = new Employee(employeeId, salary, manager,mi);
employees.add(currentEmployee);
}
Company company = new Company(this);
company.toKeep = compute(employees) ;
return company;
}
private int compute(List<Employee> employees) {
Employee ceo = employees.get(0);
List<Integer> directReports = ceo.directReports();
List<Integer> countDirectReports = Lists.newArrayList();
return 1;
}
}
}