package pl.com.bottega.documentmanagement.domain;
import com.google.common.base.Objects;
import org.hibernate.annotations.NaturalId;
import javax.persistence.*;
import java.util.Arrays;
import java.util.Set;
import static com.google.common.base.Preconditions.checkState;
/**
* Created by maciuch on 12.06.16.
*/
@Entity
public class Employee {
@EmbeddedId
private EmployeeId employeeId;
private String hashedPassword;
@NaturalId
private String login;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<Role> roles;
protected Employee() {
}
public Employee(String login, String hashedPassword, EmployeeId employeeId) {
this.login = login;
this.hashedPassword = hashedPassword;
this.employeeId = employeeId;
}
public Employee(EmployeeId employeeId) {
this.employeeId = employeeId;
}
public boolean isRegistered() {
return login != null;
}
public void setupAccount(String login, String password) {
checkState(!isRegistered());
this.login = login;
this.hashedPassword = password;
}
public void updateRoles(Set<Role> newRoles) {
this.roles = newRoles;
}
public boolean hasRoles(String[] roleNames) {
if (roleNames.length == 0)
return true;
return !Arrays.stream(roleNames).anyMatch((roleName) -> !roles.contains(new Role(roleName)));
}
public EmployeeId employeeId() {
return employeeId;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
return Objects.equal(employeeId, employee.employeeId);
}
@Override
public int hashCode() {
return Objects.hashCode(employeeId);
}
}