package net.techreadiness.service;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.jws.WebService;
import net.techreadiness.security.PermissionCode;
import net.techreadiness.service.exception.ServiceException;
import net.techreadiness.service.exception.ValidationServiceException;
import net.techreadiness.service.object.Org;
import net.techreadiness.service.object.Permission;
import net.techreadiness.service.object.Role;
import net.techreadiness.service.object.User;
@WebService
public interface UserService extends BaseService {
User getByUsername(ServiceContext context, String username);
User getById(ServiceContext context, Long userId);
Collection<User> findById(ServiceContext context, Collection<Long> userIds);
boolean userActive(ServiceContext context);
boolean hasPermission(ServiceContext context, PermissionCode... permissions);
boolean hasAccessToOrg(ServiceContext context, Long userId, Long orgId);
boolean hasAccessToOrgByCode(ServiceContext context, Long userId, String orgCode);
List<Permission> findAvailablePermissions(ServiceContext context);
boolean isUsernameUnique(ServiceContext context, String username, Long userId);
void delete(ServiceContext context, User user);
void unDelete(ServiceContext context, User user);
List<User> findAllUsersWithRole(ServiceContext context, Long roleId);
User disableUser(ServiceContext context, Long userId, Date disableDate, String reason);
User enableUser(ServiceContext context, Long userId);
/**
* Creates a new user in the DB and returns the newly created user.
*
* @param context
* The {@link ServiceContext} to be used for this service call.
* @param user
* The {@code User} to put in the DB.
* @return The newly created {@code User}, with userId populated.
* @throws ValidationServiceException
* Thrown if user can't be saved due to validation errors.
* @throws ServiceException
* Thrown for any other error condition.
*/
User create(ServiceContext context, User user) throws ValidationServiceException, ServiceException;
User createFromMap(ServiceContext context, Map<String, String> map) throws ValidationServiceException, ServiceException;
User createFromMapWithRoles(ServiceContext context, Map<String, String> map, List<Role> roles, List<Org> orgs)
throws ValidationServiceException, ServiceException;
User getNew(ServiceContext context);
User update(ServiceContext context, User user);
void changePassword(ServiceContext context, String username, String password, String confirmPassword);
void resetPassword(ServiceContext context, Long userId);
String getCurrentResetEmailText(ServiceContext context, Long userId);
void newAccountPassword(ServiceContext context, User user);
void forgotUsername(ServiceContext context, String email);
boolean isTokenValid(ServiceContext context, String username, String token);
boolean isUsernameEmailPairValid(ServiceContext context, String username, String email);
boolean isEmailInUse(ServiceContext context, String email);
void clearTokens(ServiceContext context, String username);
void updateUserSelectedScopeId(ServiceContext context);
List<Org> findOrgsForUsers(ServiceContext context, Long orgId, Long scopeId, Collection<Long> userIds);
List<Role> findRolesForUsers(ServiceContext context, Long scopeId, Collection<Long> userIds);
}