// Path: day-1/part-2/account-service/src/main/java/com/example/account/Account.java
// @NodeEntity
// public class Account {
// 
//     @GraphId
//     private Long id;
// 
//     @JsonIgnore
//     @Relationship(type = "HAS_ACCOUNT", direction = "INCOMING")
//     private User user;
//     private String accountNumber;
//     private AccountStatus status;
// 
//     public Account() {
//         accountNumber = UUID.randomUUID().toString();
//     }
// 
//     public Account(User user) {
//         this();
//         this.user = user;
//     }
// 
//     public Long getId() {
//         return id;
//     }
// 
//     public void setId(Long id) {
//         this.id = id;
//     }
// 
//     public User getUser() {
//         return user;
//     }
// 
//     public void setUser(User user) {
//         this.user = user;
//     }
// 
//     public String getAccountNumber() {
//         return accountNumber;
//     }
// 
//     public void setAccountNumber(String accountNumber) {
//         this.accountNumber = accountNumber;
//     }
// 
//     public AccountStatus getStatus() {
//         return status;
//     }
// 
//     public void setStatus(AccountStatus status) {
//         this.status = status;
//     }
// 
//     public Long getUserId() {
//         return user != null ? user.getUserId() : null;
//     }
// 
//     @Override
//     public String toString() {
//         return "Account{" +
//                 "id=" + id +
//                 ", user=" + user +
//                 ", accountNumber='" + accountNumber + '\'' +
//                 '}';
//     }
// }
// 
// Path: day-1/part-2/account-service/src/main/java/com/example/account/AccountService.java
// @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) {
//             throw new RuntimeException("Cannot create a new account for an inactive user");
//         }
// 
//         // Set the user relationship on the new account object
//         account.setUser(new User(userId));
// 
//         return accountRepository.save(account);
//     }
// 
//     public Account getAccount(String accountNumber) {
//         return accountRepository.getAccountByAccountNumber(accountNumber);
//     }
// 
//     public Set<Account> getAccounts(Long userId) {
//         User user = userRepository.getUserByUserId(userId);
// 
//         if(user == null) {
//             return Collections.emptySet();
//         }
// 
//         return user.getAccounts();
//     }
// }


import com.example.account.Account;
import com.example.account.AccountService;
import org.springframework.web.bind.annotation.*;
import java.util.List;
package com.example.user;



@RestController
@RequestMapping("/v1/users")
public class UserController {

    private AccountService accountService;

    public UserController(AccountService accountService) {
        this.accountService = accountService;
    }

    @GetMapping("/{userId}/accounts")
// Path: day-1/part-2/account-service/src/main/java/com/example/account/Account.java
// @NodeEntity
// public class Account {
// 
//     @GraphId
//     private Long id;
// 
//     @JsonIgnore
//     @Relationship(type = "HAS_ACCOUNT", direction = "INCOMING")
//     private User user;
//     private String accountNumber;
//     private AccountStatus status;
// 
//     public Account() {
//         accountNumber = UUID.randomUUID().toString();
//     }
// 
//     public Account(User user) {
//         this();
//         this.user = user;
//     }
// 
//     public Long getId() {
//         return id;
//     }
// 
//     public void setId(Long id) {
//         this.id = id;
//     }
// 
//     public User getUser() {
//         return user;
//     }
// 
//     public void setUser(User user) {
//         this.user = user;
//     }
// 
//     public String getAccountNumber() {
//         return accountNumber;
//     }
// 
//     public void setAccountNumber(String accountNumber) {
//         this.accountNumber = accountNumber;
//     }
// 
//     public AccountStatus getStatus() {
//         return status;
//     }
// 
//     public void setStatus(AccountStatus status) {
//         this.status = status;
//     }
// 
//     public Long getUserId() {
//         return user != null ? user.getUserId() : null;
//     }
// 
//     @Override
//     public String toString() {
//         return "Account{" +
//                 "id=" + id +
//                 ", user=" + user +
//                 ", accountNumber='" + accountNumber + '\'' +
//                 '}';
//     }
// }
// 
// Path: day-1/part-2/account-service/src/main/java/com/example/account/AccountService.java
// @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) {
//             throw new RuntimeException("Cannot create a new account for an inactive user");
//         }
// 
//         // Set the user relationship on the new account object
//         account.setUser(new User(userId));
// 
//         return accountRepository.save(account);
//     }
// 
//     public Account getAccount(String accountNumber) {
//         return accountRepository.getAccountByAccountNumber(accountNumber);
//     }
// 
//     public Set<Account> getAccounts(Long userId) {
//         User user = userRepository.getUserByUserId(userId);
// 
//         if(user == null) {
//             return Collections.emptySet();
//         }
// 
//         return user.getAccounts();
//     }
// }


// Path: day-1/part-4/account-service/src/main/java/com/example/user/UserController.java
import com.example.account.Account;
import com.example.account.AccountService;
import org.springframework.web.bind.annotation.*;
import java.util.List;

package com.example.user;



@RestController
@RequestMapping("/v1/users")
public class UserController {

    private AccountService accountService;

    public UserController(AccountService accountService) {
        this.accountService = accountService;
    }

    @GetMapping("/{userId}/accounts")
    public List<Account> getUserAccounts(@PathVariable Long userId) {