package jondo;

import java.sql.Timestamp;
import java.util.Date;

import logging.LogHolder;
import logging.LogLevel;
import logging.LogType;

import anon.pay.PayAccount;
import anon.pay.xml.XMLBalance;

public class JonDonymAccount 
{
	private PayAccount m_account;
	
	protected JonDonymAccount(PayAccount a_account)
	{
		if (a_account == null)
		{
			throw new NullPointerException();
		}
		m_account = a_account;
	}
	
	protected PayAccount getAccount()
	{
		return m_account;
	}

	public long getNumber()
	{
		return m_account.getAccountNumber();
	}
	
	public boolean update()
	{
		try 
		{
			return (m_account.fetchAccountInfo(true) != null);
		} 
		catch (Exception a_e) 
		{
			LogHolder.log(LogLevel.ERR, LogType.GUI, a_e);
		}
		return false;
	}
	
	public long getCurrentVolume()
	{
		return m_account.getCurrentCredit();
	}
	
	public boolean isBlocked()
	{
		return m_account.isBlocked();
	}
	
	public boolean isActive()
	{
		return m_account.getPrivateKey() != null;
	}
	
	public boolean hasExpired()
	{
		return m_account.hasExpired();
	}
	
	public boolean hasExpired(Date a_time)
	{
		return m_account.hasExpired(toTimestamp(a_time));
	}
	
	public Date expiresOn()
	{
		XMLBalance balance = m_account.getBalance();
		if (balance != null)
		{
			return balance.getFlatEnddate(); 
		}
		
		return null;
	}
	
	public boolean isLastMonthOfRate()
	{
		return isLastMonthOfRate(new Date());
	}
	
	public boolean isLastMonthOfRate(Date a_dateNow)
	{
		XMLBalance balance = m_account.getBalance();
		if (balance == null)
		{
			return true;
		}
		
		if (balance.getStartDate() == null)
		{
			return false;
		}
		
		return XMLBalance.isLastMonthOfRate(balance.getFlatEnddate(), 
				toTimestamp(a_dateNow), balance.getStartDate());
	}
	
	public MonthlyOverusage calculateMonthlyOverusage(Date a_dateNow)
	{
		XMLBalance balance = m_account.getBalance();
		
		if (balance == null)
		{
			return null;
		}
		
		MonthlyOverusage monthlyOverusage = new MonthlyOverusage();
		
		XMLBalance.MonthlyOverusage balanceMonthlyOverusage =
			balance.calculateMonthlyOverusage(toTimestamp(a_dateNow));
		
		if (balanceMonthlyOverusage == null)
		{
			return null;
		}
		
		monthlyOverusage.m_dFactor = balanceMonthlyOverusage.m_dFactor;
		monthlyOverusage.m_dateEndOfCurrentPeriod = balanceMonthlyOverusage.m_tEndOfCurrentPeriod;
		monthlyOverusage.m_lAdditionalTraffic = balanceMonthlyOverusage.m_lAdditionalTraffic;
		
		
		return monthlyOverusage;
	}
	
	public boolean canDoMonthlyOverusage(Date a_dateNow)
	{
		return m_account.canDoMonthlyOverusage(toTimestamp(a_dateNow));
	}
	
	public boolean isCurrentlyInOverusage(Date a_dateNow)
	{
		XMLBalance balance = m_account.getBalance();
		
		if (balance == null)
		{
			return false;
		}
		
		return balance.isCurrentlyInOverusage(toTimestamp(a_dateNow));
	}
	
	public long getMonthlyVolume()
	{
		return m_account.getVolumeBytesMonthly();
	}
	
	public boolean equals(Object a_account)
	{
		return m_account.equals(((JonDonymAccount)a_account).getAccount());
	}
	
	public int hashCode()
	{
		return m_account.hashCode();
	}
	
	public class MonthlyOverusage
	{
		public double m_dFactor;
		public Date m_dateEndOfCurrentPeriod;
		public long m_lAdditionalTraffic;
	}
	
	private Timestamp toTimestamp(Date a_date)
	{
		Timestamp tNow;
		
		if (a_date == null)
		{
			return null;
		}
		
		if (a_date instanceof Timestamp)
		{
			tNow = (Timestamp)a_date;
		}
		else
		{
			tNow = new Timestamp(System.currentTimeMillis());
		}
		return tNow;
	}
}
