// Path: src/main/java/se/omegapoint/facepalm/domain/NewUserCredentials.java
// public class NewUserCredentials {
//     public final String username;
//     public final String email;
//     public final String firstname;
//     public final String lastname;
//     public final String password;
// 
//     public NewUserCredentials(final String username, final String email, final String firstname, final String lastname, final String password) {
//         this.username = notBlank(username);
//         this.email = notBlank(email);
//         this.firstname = notBlank(firstname);
//         this.lastname = notBlank(lastname);
//         this.password = notBlank(password);
//     }
// 
//     @Override
//     public boolean equals(final Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
//         final NewUserCredentials that = (NewUserCredentials) o;
//         return Objects.equals(username, that.username) &&
//                 Objects.equals(email, that.email) &&
//                 Objects.equals(firstname, that.firstname) &&
//                 Objects.equals(lastname, that.lastname) &&
//                 Objects.equals(password, that.password);
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(username, email, firstname, lastname, password);
//     }
// 
//     @Override
//     public String toString() {
//         return "NewUserCredentials{" +
//                 "username='" + username + '\'' +
//                 ", email='" + email + '\'' +
//                 ", firstname='" + firstname + '\'' +
//                 ", lastname='" + lastname + '\'' +
//                 ", password='" + password + '\'' +
//                 '}';
//     }
// }
// 
// Path: src/main/java/se/omegapoint/facepalm/domain/User.java
// public class User {
//     public final String username;
//     public final String email;
//     public final String firstname;
//     public final String lastname;
// 
//     /*
//         Is there a better way than just using strings I wonder?
//      */
//     public User(final String username, final String email, final String firstname, final String lastname) {
//         this.username = notBlank(username);
//         this.email = notBlank(email);
//         this.firstname = notBlank(firstname);
//         this.lastname = notBlank(lastname);
//     }
// 
//     @Override
//     public boolean equals(final Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
//         final User user = (User) o;
//         return Objects.equals(username, user.username) &&
//                 Objects.equals(email, user.email) &&
//                 Objects.equals(firstname, user.firstname) &&
//                 Objects.equals(lastname, user.lastname);
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(username, email, firstname, lastname);
//     }
// 
//     @Override
//     public String toString() {
//         return "User{" +
//                 "username='" + username + '\'' +
//                 ", email='" + email + '\'' +
//                 ", firstname='" + firstname + '\'' +
//                 ", lastname='" + lastname + '\'' +
//                 '}';
//     }
// }
// 
// Path: src/main/java/se/omegapoint/facepalm/domain/repository/UserRepository.java
// public interface UserRepository {
//     Optional<User> findByUsername(final String username);
// 
//     Set<User> findFriendsFor(String username);
// 
//     Optional<User> findByNameAndPassword(final String username, final String password);
// 
//     List<User> findLike(String value);
// 
//     void addFriend(String user, String friend);
// 
//     void addUser(NewUserCredentials credentials);
// 
//     boolean usersAreFriends(String userA, String userB);
// }


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import se.omegapoint.facepalm.domain.NewUserCredentials;
import se.omegapoint.facepalm.domain.User;
import se.omegapoint.facepalm.domain.repository.UserRepository;
import java.util.List;
import java.util.Optional;
import static org.apache.commons.lang3.Validate.notBlank;
import static se.omegapoint.facepalm.application.UserService.UserFailure.USER_ALREADY_EXISTS;
import static se.omegapoint.facepalm.application.UserService.UserFailure.USER_DOES_NOT_EXIST;
import static se.omegapoint.facepalm.application.UserService.UserSuccess.USER_REGISTERD;
/*
 * Copyright 2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package se.omegapoint.facepalm.application;




@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public Result<UserSuccess, UserFailure> registerUser(final String username, final String email, final String firstname, final String lastname, final String password) {
        notBlank(username);
        notBlank(email);
        notBlank(firstname);
        notBlank(lastname);
        notBlank(password);

// Path: src/main/java/se/omegapoint/facepalm/domain/NewUserCredentials.java
// public class NewUserCredentials {
//     public final String username;
//     public final String email;
//     public final String firstname;
//     public final String lastname;
//     public final String password;
// 
//     public NewUserCredentials(final String username, final String email, final String firstname, final String lastname, final String password) {
//         this.username = notBlank(username);
//         this.email = notBlank(email);
//         this.firstname = notBlank(firstname);
//         this.lastname = notBlank(lastname);
//         this.password = notBlank(password);
//     }
// 
//     @Override
//     public boolean equals(final Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
//         final NewUserCredentials that = (NewUserCredentials) o;
//         return Objects.equals(username, that.username) &&
//                 Objects.equals(email, that.email) &&
//                 Objects.equals(firstname, that.firstname) &&
//                 Objects.equals(lastname, that.lastname) &&
//                 Objects.equals(password, that.password);
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(username, email, firstname, lastname, password);
//     }
// 
//     @Override
//     public String toString() {
//         return "NewUserCredentials{" +
//                 "username='" + username + '\'' +
//                 ", email='" + email + '\'' +
//                 ", firstname='" + firstname + '\'' +
//                 ", lastname='" + lastname + '\'' +
//                 ", password='" + password + '\'' +
//                 '}';
//     }
// }
// 
// Path: src/main/java/se/omegapoint/facepalm/domain/User.java
// public class User {
//     public final String username;
//     public final String email;
//     public final String firstname;
//     public final String lastname;
// 
//     /*
//         Is there a better way than just using strings I wonder?
//      */
//     public User(final String username, final String email, final String firstname, final String lastname) {
//         this.username = notBlank(username);
//         this.email = notBlank(email);
//         this.firstname = notBlank(firstname);
//         this.lastname = notBlank(lastname);
//     }
// 
//     @Override
//     public boolean equals(final Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
//         final User user = (User) o;
//         return Objects.equals(username, user.username) &&
//                 Objects.equals(email, user.email) &&
//                 Objects.equals(firstname, user.firstname) &&
//                 Objects.equals(lastname, user.lastname);
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(username, email, firstname, lastname);
//     }
// 
//     @Override
//     public String toString() {
//         return "User{" +
//                 "username='" + username + '\'' +
//                 ", email='" + email + '\'' +
//                 ", firstname='" + firstname + '\'' +
//                 ", lastname='" + lastname + '\'' +
//                 '}';
//     }
// }
// 
// Path: src/main/java/se/omegapoint/facepalm/domain/repository/UserRepository.java
// public interface UserRepository {
//     Optional<User> findByUsername(final String username);
// 
//     Set<User> findFriendsFor(String username);
// 
//     Optional<User> findByNameAndPassword(final String username, final String password);
// 
//     List<User> findLike(String value);
// 
//     void addFriend(String user, String friend);
// 
//     void addUser(NewUserCredentials credentials);
// 
//     boolean usersAreFriends(String userA, String userB);
// }


// Path: src/main/java/se/omegapoint/facepalm/application/UserService.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import se.omegapoint.facepalm.domain.NewUserCredentials;
import se.omegapoint.facepalm.domain.User;
import se.omegapoint.facepalm.domain.repository.UserRepository;
import java.util.List;
import java.util.Optional;
import static org.apache.commons.lang3.Validate.notBlank;
import static se.omegapoint.facepalm.application.UserService.UserFailure.USER_ALREADY_EXISTS;
import static se.omegapoint.facepalm.application.UserService.UserFailure.USER_DOES_NOT_EXIST;
import static se.omegapoint.facepalm.application.UserService.UserSuccess.USER_REGISTERD;

/*
 * Copyright 2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package se.omegapoint.facepalm.application;




@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public Result<UserSuccess, UserFailure> registerUser(final String username, final String email, final String firstname, final String lastname, final String password) {
        notBlank(username);
        notBlank(email);
        notBlank(firstname);
        notBlank(lastname);
        notBlank(password);

        final NewUserCredentials credentials = new NewUserCredentials(username, email, firstname, lastname, password);