package database.wallet;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Observable;
import org.mapdb.DB;
import qora.account.Account;
import utils.ObserverMessage;
public class AccountMap extends Observable {
private static final String ADDRESSES = "addresses";
private Map<String, BigDecimal> addressMap;
private List<Account> accounts;
public AccountMap(WalletDatabase walletDatabase, DB database)
{
//OPEN MAP
this.addressMap = database.getTreeMap(ADDRESSES);
}
private void loadAccounts()
{
//RESET ACCOUNTS LIST
this.accounts = new ArrayList<Account>();
synchronized(this.accounts)
{
for(String address: this.addressMap.keySet())
{
//CREATE ACCOUNT FROM ADDRESS
Account account = new Account(address);
//ADD TO LIST
this.accounts.add(account);
}
}
}
public List<Account> getAccounts()
{
if(this.accounts == null)
{
this.loadAccounts();
}
return this.accounts;
}
public boolean exists(String address)
{
return this.addressMap.containsKey(address);
}
public Account getAccount(String address)
{
if(this.accounts == null)
{
this.loadAccounts();
}
synchronized(this.accounts)
{
for(Account account: this.accounts)
{
if(account.getAddress().equals(address))
{
return account;
}
}
}
return null;
}
public BigDecimal getUnconfirmedBalance(String address)
{
if(this.addressMap.containsKey(address))
{
return this.addressMap.get(address);
}
return BigDecimal.ZERO.setScale(8);
}
public void add(Account account)
{
this.addressMap.put(account.getAddress(), account.getConfirmedBalance());
if(this.accounts == null)
{
this.loadAccounts();
}
synchronized(this.accounts)
{
if(!this.accounts.contains(account))
{
this.accounts.add(account);
this.notifyObservers(new ObserverMessage(ObserverMessage.ADD_ACCOUNT_TYPE, account));
}
}
}
public void update(Account account, BigDecimal unconfirmedBalance)
{
this.addressMap.put(account.getAddress(), unconfirmedBalance);
this.notifyObservers(new ObserverMessage(ObserverMessage.ADD_ACCOUNT_TYPE, account));
}
public void delete(Account account)
{
this.addressMap.remove(account.getAddress());
if(this.accounts == null)
{
this.loadAccounts();
}
synchronized(this.accounts)
{
this.accounts.remove(account);
this.notifyObservers(new ObserverMessage(ObserverMessage.REMOVE_ACCOUNT_TYPE, account));
}
}
}