// file CreditCard.java

public class CreditCard
{
   // constructor methods

   public CreditCard(int no, java.lang.String aName, double aLimit)
    { assert 0 < no && no <= 999999 && aLimit > 0; // precondition
      number = String.format("%06d", no) + "-";
      int digitSum = 0;
      while(no > 0)
      {  digitSum = digitSum + no % 10;
         no = no / 10;
      }
      number = number + (MOD - digitSum % MOD);
      name = aName;
      limit = aLimit;
      balance = 0;
   }

   public CreditCard(int no, String aName)
   {  this(no, aName, DEFAULT_LIMIT);
   }

   // instance methods

   // accessors

   public double getBalance()
   {  return balance;
   }

   public double getLimit()
   {  return limit;
   }

   public String getName()
   {  return name;
   }

   public String getNumber()
   {  return number;
   }

   // mutators

   public boolean setLimit(double newLimit)
   {  if(newLimit >= 0 && newLimit >= balance)
      {  limit = newLimit;
         return true;
      }
      else
      {  return false;
      }
   }

   // specialized methods

   public boolean charge(double amount)
    { assert amount >= 0; // precondition
      if(balance+amount > limit)
      {  return false;
      }
      else
      {  balance = balance + amount;
         return true;
      }
   }

   public void credit(double amount)
   {  assert amount >= 0; // precondition
      balance = balance - amount;
   }

   public void pay(double amount)
   {  assert amount >= 0; // precondition
      balance = balance - amount;
   }

   // standard methods

   public boolean equals(Object anObject)
   {  return (anObject instanceof CreditCard &&
              number.equals(((CreditCard)anObject).number));
   }

   public String toString()
   {  String res = "CARD [";
      res = res + "NO=" + number;
      res = res + ", BALANCE=";
      res = res + String.format("%.2f", balance) + "]";
      return res;
   }

   // instance variables/attributes/fields

   private String number;
   private String name;
   private double limit;
   private double balance;

   // class/static variables/attributes/fields

   public static double DEFAULT_LIMIT = 1000.0;
   public static int MIN_NAME_LENGTH = 3;
   public static int MOD = 9;
   public static int SEQUENCE_NUMBER_LENGTH = 6;

}// end class CreditCard

