package org.ntlab.citrusserver.repositories;
import org.ntlab.citrusserver.entities.Account;
import org.springframework.stereotype.Repository;
import java.util.*;
import java.util.HashMap;
@Repository
public class AccountManager {
    private final HashMap<String, Account> accounts = new HashMap<String, Account>(); //keyにaccountId,valueにAccount
    private final HashMap<String, String> accountToken = new HashMap<>(); //keyがaccountId,valueがtoken
    // アカウントの一覧をリストとして返す(GET)
    public Set<String> getAccountsID() {
        return accounts.keySet();
    }
    // account_idとpasswordを設定し新しいアカウントを作成する(POST)
    public String createAccount(String accountId, String password) {
        UUID str = UUID.randomUUID();
        String token = str.toString();
        Account account = new Account(accountId, password);
        if(!accounts.containsKey(accountId)) {
            accounts.put(accountId, account);
            accountToken.put(accountId, token); //accountIDとtokenをHashMapに入れる
        }
        return token;
    }
    //accountIdとtokenを比較してtrueかfalseを返す
    public boolean checkToken(String accountId, String token) {
        if(accounts.containsKey(accountId)) {
            return accountToken.get(accountId).equals(token);
        }
        return false;
    }
    // 指定されたアカウントの情報を返す(GET)
    public Account getAccount(String accountId) {
        return accounts.get(accountId);
    }
    // アカウント情報を全削除する(DELETE)
    public void deleteAccount(String accountId, String token, String password) {
        if(accountToken.get(accountId).equals(token)) { //token比較
            if(accounts.get(accountId).getPassword().equals(password)) { //password比較
                accounts.remove(accountId);
            }
        }
    }
    // 指定されたIDのパスワードを変更する (PUT)
    public void changePassword(String accountId, String newPassword, String oldPassword, String token) {
        if(accountToken.get(accountId).equals(token)) { //token比較
            if(accounts.get(accountId).getPassword().equals(oldPassword)) { //password比較
                accounts.get(accountId).setPassword(newPassword);
            }
        }
    }
    // 指定されたIDの自己紹介を返す(GET)
    public String AccountIntro(String accountId) {
        return accounts.get(accountId).getIntroduction();
    }
    // 指定されたIDの自己紹介を変更する (PUT)
    public void changeIntroduction(String accountId, String introduction, String token) {
        if(accountToken.get(accountId).equals(token)) { //token比較
            accounts.get(accountId).setIntroduction(introduction);
        }
    }
    // 指定されたIDのお気に入りの本のリストを返す(GET)
    public ArrayList<HashMap<String, String>> Favorites(String accountId, String token) {
        return null;
    }
    // 指定されたIDのお気に入りの本のリストを返す(指定した人物) (GET)
    public ArrayList<Integer> FavoritesBookId(String accountId, String otherAccountId, String token) {
        return null;
    }
    // お気に入りの本のbook_idを削除する (DELETE)
    public void deleteFavoriteBookId(String token, String accountId, String otherAccountId, Integer bookId) {
    }
    // いいねした本のアカウントIDとbook_idを追加する(いいねした側に追加) (PUT)
    public void putFavoriteId(String accountId, String otherAccountId, Integer bookId, String token) {
    }
    // アカウントidとパスワードでログインし、tokenを返す (POST)
    public String login(String accountId, String password) {
        if(accounts.get(accountId).getPassword().equals(password)) {
            UUID str = UUID.randomUUID();
            String token = str.toString();
            accountToken.put(accountId, token);
            return accountToken.get(accountId);
        }
        return null;
    }
}