// Path: day-1/part-4/account-service/src/main/java/com/example/user/User.java
// @Entity
// public class User {
// 
//     @Id
//     @GeneratedValue(strategy = GenerationType.AUTO)
//     private Long id;
// 
//     @Transient
//     private UserStatus status;
// 
//     private Long userId;
// 
//     @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "user")
//     private List<Account> accounts;
// 
//     public User() {
//     }
// 
//     public User(Long userId) {
//         this.userId = userId;
//     }
// 
//     public Long getId() {
//         return id;
//     }
// 
//     public void setId(Long id) {
//         this.id = id;
//     }
// 
//     public Long getUserId() {
//         return userId;
//     }
// 
//     public void setUserId(Long userId) {
//         this.userId = userId;
//     }
// 
//     public List<Account> getAccounts() {
//         return accounts;
//     }
// 
//     public void setAccounts(List<Account> accounts) {
//         this.accounts = accounts;
//     }
// 
//     public UserStatus getStatus() {
//         return status;
//     }
// 
//     public void setStatus(UserStatus status) {
//         this.status = status;
//     }
// 
//     @Override
//     public String toString() {
//         return "User{" +
//                 "id=" + id +
//                 ", status=" + status +
//                 ", userId=" + userId +
//                 ", accounts=" + accounts +
//                 '}';
//     }
// }
// 
// Path: day-1/part-2/account-service/src/main/java/com/example/user/UserRepository.java
// public interface UserRepository extends GraphRepository<User> {
//     User getUserByUserId(Long userId);
// }
// 
// Path: day-1/part-4/account-service/src/main/java/com/example/user/UserService.java
// @Service
// @Transactional
// public class UserService {
// 
//     private RestTemplate restTemplate;
// 
//     public UserService(RestTemplate restTemplate) {
//         this.restTemplate = restTemplate;
//     }
// 
//     public User getUser(Long userId) {
//         User user = null;
// 
//         ResponseEntity<User> response =
//                 restTemplate.getForEntity(URI.create("http://user-service/users/" + userId), User.class);
// 
//         if (response.getStatusCode().is2xxSuccessful())
//             user = response.getBody();
// 
//         return user;
//     }
// }
// 
// Path: day-1/part-4/account-service/src/main/java/com/example/user/UserStatus.java
// public enum  UserStatus {
//     ACTIVE,
//     INACTIVE
// }


import com.example.user.User;
import com.example.user.UserRepository;
import com.example.user.UserService;
import com.example.user.UserStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.Collections;
import java.util.Set;
package com.example.account;



@Service
@Transactional
public class AccountService {

    private AccountRepository accountRepository;
    private UserService userService;
    private UserRepository userRepository;

    public AccountService(AccountRepository accountRepository, UserService userService, UserRepository userRepository) {
        this.accountRepository = accountRepository;
        this.userService = userService;
        this.userRepository = userRepository;
    }

    public Account createAccount(Long userId, Account account) {
        // Call the user microservice
        User user = userService.getUser(userId);

        Assert.notNull(user, "The user with the ID could not be found");

        // The user must not be inactive
// Path: day-1/part-4/account-service/src/main/java/com/example/user/User.java
// @Entity
// public class User {
// 
//     @Id
//     @GeneratedValue(strategy = GenerationType.AUTO)
//     private Long id;
// 
//     @Transient
//     private UserStatus status;
// 
//     private Long userId;
// 
//     @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "user")
//     private List<Account> accounts;
// 
//     public User() {
//     }
// 
//     public User(Long userId) {
//         this.userId = userId;
//     }
// 
//     public Long getId() {
//         return id;
//     }
// 
//     public void setId(Long id) {
//         this.id = id;
//     }
// 
//     public Long getUserId() {
//         return userId;
//     }
// 
//     public void setUserId(Long userId) {
//         this.userId = userId;
//     }
// 
//     public List<Account> getAccounts() {
//         return accounts;
//     }
// 
//     public void setAccounts(List<Account> accounts) {
//         this.accounts = accounts;
//     }
// 
//     public UserStatus getStatus() {
//         return status;
//     }
// 
//     public void setStatus(UserStatus status) {
//         this.status = status;
//     }
// 
//     @Override
//     public String toString() {
//         return "User{" +
//                 "id=" + id +
//                 ", status=" + status +
//                 ", userId=" + userId +
//                 ", accounts=" + accounts +
//                 '}';
//     }
// }
// 
// Path: day-1/part-2/account-service/src/main/java/com/example/user/UserRepository.java
// public interface UserRepository extends GraphRepository<User> {
//     User getUserByUserId(Long userId);
// }
// 
// Path: day-1/part-4/account-service/src/main/java/com/example/user/UserService.java
// @Service
// @Transactional
// public class UserService {
// 
//     private RestTemplate restTemplate;
// 
//     public UserService(RestTemplate restTemplate) {
//         this.restTemplate = restTemplate;
//     }
// 
//     public User getUser(Long userId) {
//         User user = null;
// 
//         ResponseEntity<User> response =
//                 restTemplate.getForEntity(URI.create("http://user-service/users/" + userId), User.class);
// 
//         if (response.getStatusCode().is2xxSuccessful())
//             user = response.getBody();
// 
//         return user;
//     }
// }
// 
// Path: day-1/part-4/account-service/src/main/java/com/example/user/UserStatus.java
// public enum  UserStatus {
//     ACTIVE,
//     INACTIVE
// }


// Path: day-1/part-2/account-service/src/main/java/com/example/account/AccountService.java
import com.example.user.User;
import com.example.user.UserRepository;
import com.example.user.UserService;
import com.example.user.UserStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.Collections;
import java.util.Set;

package com.example.account;



@Service
@Transactional
public class AccountService {

    private AccountRepository accountRepository;
    private UserService userService;
    private UserRepository userRepository;

    public AccountService(AccountRepository accountRepository, UserService userService, UserRepository userRepository) {
        this.accountRepository = accountRepository;
        this.userService = userService;
        this.userRepository = userRepository;
    }

    public Account createAccount(Long userId, Account account) {
        // Call the user microservice
        User user = userService.getUser(userId);

        Assert.notNull(user, "The user with the ID could not be found");

        // The user must not be inactive
        if (user.getStatus() != UserStatus.ACTIVE) {