package ru.job4j.bank;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Iterator;


/**.
 * Class Account implements account.
 * @author Mikhail Vlasov
 * @since 11.24.2017
 * @version 1
 */
public class Bank {
    /**.
     * Map of users and List of accounts for each of them.
     */
    private Map<User, List<Account>> usersAndAccounts = new HashMap<>();

    /**.
     * Getter for usersAndAccounts.
     * @return Map<User, List<Account>> usersAndAccounts.
     */
    public Map<User, List<Account>> getUsersAndAccounts() {
        return usersAndAccounts;
    }

    /**.
     * Добавление пользователя.
     * @param user to be added.
     */
    public void addUser(User user) {
        usersAndAccounts.putIfAbsent(user, new ArrayList<>());
    }

    /**.
     * Удаление пользователя.
     * @param user to be deleted.
     */
    public void deleteUser(User user) {
        usersAndAccounts.remove(user);
    }

    /**.
     * Добавление счёта пользователю.
     * @param user которому добовляем.
     * @param account который добавляем.
     */
    public void addAccountToUser(User user, Account account) {
        usersAndAccounts.get(user).add(account);
    }

    /**.
     * Удаление одного счёта пользователя.
     * @param user которому удаляем.
     * @param account который удаляем.
     */
    public void deleteAccountFromUser(User user, Account account) {
        Iterator<Account> itr = usersAndAccounts.get(user).iterator();
        while (itr.hasNext()) {
            if (itr.next().getRequisites() == account.getRequisites()) {
                itr.remove();
                break;
            }
        }
    }

    /**.
     * Получаем список счетов для пользователя.
     * @param user для которого получаем.
     * @return List<Account> список счетов.
     */
    public List<Account> getUserAccounts(User user) {
        return usersAndAccounts.get(user);
    }

    /**.
     * Метод для перечисления денег с одного счёта на другой счёт:
     * если счёт не найден или не хватает денег на счёте srcAccount (с которого переводят) должен вернуть false.
     * @param srcUser отправитель.
     * @param srcAccount счёт отправителя.
     * @param dstUser получатель.
     * @param dstAccount счёт получателя.
     * @param amount сумма перевода.
     * @return boolean true, если перевод прошёл.
     */
    public boolean transferMoney(User srcUser, Account srcAccount, User dstUser, Account dstAccount, double amount) {
        List<Account> srcAccountList = usersAndAccounts.get(srcUser);
        List<Account> dstAccountList = usersAndAccounts.get(dstUser);
        Integer srcAccountIndex = null, dstAccountIndex = null;

        srcAccountIndex = srcAccountList.indexOf(srcAccount);
        //Проверяем, запрашиваемый счёт, с которого отправляем. Существует ли и принадлежит ли пользователю.
        if (srcAccountIndex == null || srcAccountIndex < 0) {
            return false;
        }

        //Проверяем, хватает ли средств на счёте отправителя.
        if (srcAccountList.get(srcAccountIndex).getValue() < amount) {
            return false;
        }

        dstAccountIndex = dstAccountList.indexOf(dstAccount);
        //Проверяем, запрашиваемый счёт, на который отправляем. Существует ли и принадлежит ли пользователю.
        if (dstAccountIndex == null || dstAccountIndex < 0) {
            return false;
        }

        //Делаем перевод.
        srcAccountList.get(srcAccountIndex).setValue(srcAccountList.get(srcAccountIndex).getValue() - amount);
        dstAccountList.get(dstAccountIndex).setValue(dstAccountList.get(dstAccountIndex).getValue() + amount);
        return true;
    }

}

@@ -1457,32 +1457,8 @@
     
- Iterator%3CAccount%3E itr =
  use
@@ -1485,201 +1485,24 @@
 er).
-iterator();%0A        while (itr.hasNext()) %7B%0A            if (itr.next().getRequisites() == account.getRequisites()) %7B%0A                itr.remove();%0A                break;%0A            %7D%0A        %7D
+remove(account);
 %0A   
@@ -2575,32 +2575,94 @@
 Of(srcAccount);%0A
+        dstAccountIndex = dstAccountList.indexOf(dstAccount);%0A
         //%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80
@@ -2714,36 +2714,45 @@
 %D0%BC. %D0%A1%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D1%83%D0%B5%D1%82 %D0%BB%D0%B8
- %D0%B8 %D0%BF
+,%0A        //%D0%9F
 %D1%80%D0%B8%D0%BD%D0%B0%D0%B4%D0%BB%D0%B5%D0%B6%D0%B8%D1%82 %D0%BB%D0%B8 %D0%BF%D0%BE
@@ -2767,107 +2767,8 @@
 %D0%BB%D1%8E.%0A
-        if (srcAccountIndex == null %7C%7C srcAccountIndex %3C 0) %7B%0A            return false;%0A        %7D%0A%0A
     
@@ -2782,16 +2782,22 @@
 %D1%80%D0%BE%D0%B2%D0%B5%D1%80%D1%8F%D0%B5%D0%BC
+ %D1%82%D0%B0%D0%BA%D0%B6%D0%B5
 , %D1%85%D0%B2%D0%B0%D1%82%D0%B0%D0%B5
@@ -2835,178 +2835,8 @@
 %D0%BB%D1%8F.%0A
-        if (srcAccountList.get(srcAccountIndex).getValue() %3C amount) %7B%0A            return false;%0A        %7D%0A%0A        dstAccountIndex = dstAccountList.indexOf(dstAccount);%0A
     
@@ -2912,12 +2912,22 @@
 %D1%82 %D0%BB%D0%B8
- %D0%B8 %D0%BF
+,%0A        // %D0%9F
 %D1%80%D0%B8%D0%BD%D0%B0
@@ -2962,16 +2962,173 @@
     if (
+srcAccountIndex == null%0A                %7C%7C srcAccountIndex %3C 0%0A                %7C%7C srcAccountList.get(srcAccountIndex).getValue() %3C amount%0A                %7C%7C 
 dstAccou
@@ -3142,16 +3142,32 @@
  == null
+%0A               
  %7C%7C dstA

Task 10038