// Path: mangopay/src/main/java/com/mangopay/android/sdk/model/exception/MangoException.java
// public class MangoException extends RuntimeException {
// 
//   private String id;
//   private String type;
//   private long timestamp;
// 
//   public MangoException(Throwable throwable) {
//     super(throwable);
//     this.id = ErrorCode.SDK_ERROR.getValue();
//     this.timestamp = System.currentTimeMillis();
//   }
// 
//   public MangoException(String id, String message) {
//     this(id, message, null);
//   }
// 
//   public MangoException(String id, String message, String type) {
//     super(message);
//     this.id = id;
//     this.type = type;
//     this.timestamp = System.currentTimeMillis();
//   }
// 
//   public String getId() {
//     return id;
//   }
// 
//   public void setId(String id) {
//     this.id = id;
//   }
// 
//   public String getType() {
//     return type;
//   }
// 
//   public void setType(String type) {
//     this.type = type;
//   }
// 
//   public long getTimestamp() {
//     return timestamp;
//   }
// 
//   public void setTimestamp(long timestamp) {
//     this.timestamp = timestamp;
//   }
// 
//   @Override public boolean equals(Object o) {
//     if (this == o) return true;
//     if (o == null || getClass() != o.getClass()) return false;
// 
//     MangoException error = (MangoException) o;
// 
//     return !(id != null ? !id.equals(error.id) : error.id != null);
// 
//   }
// 
//   @Override public int hashCode() {
//     return id != null ? id.hashCode() : 0;
//   }
// 
//   @Override public String toString() {
//     return "MangoError{" +
//             "id='" + id + '\'' +
//             ", message='" + getMessage() + '\'' +
//             ", type='" + type + '\'' +
//             ", timestamp=" + timestamp +
//             '}';
//   }
// }
// 
// Path: mangopay/src/main/java/com/mangopay/android/sdk/util/PrintLog.java
// public final class PrintLog {
// 
//   private static final String TAG = "MangoPay";
//   private static LogLevel LOG_LEVEL = LogLevel.NONE;
// 
//   private PrintLog() {
//   }
// 
// 
//   /**
//    * Set the level of the logger: 'NONE' or 'FULL'. by default it's 'NONE'.
//    *
//    * @param level The level of the logger
//    */
//   public static void setLogLevel(LogLevel level) {
//     LOG_LEVEL = level;
//   }
// 
//   /**
//    * Send a DEBUG log message.
//    *
//    * @param message The message you would like logged.
//    */
//   public static void debug(String message) {
//     if (LOG_LEVEL == LogLevel.NONE)
//       return;
// 
//     if (message.length() > 4000) {
//       Log.d(TAG, message.substring(0, 4000));
//       debug(message.substring(4000));
//     } else {
//       Log.d(TAG, message);
//     }
//   }
// 
//   /**
//    * Send a WARN log message.
//    *
//    * @param message The message you would like logged.
//    */
//   public static void warning(String message) {
//     if (LOG_LEVEL == LogLevel.NONE)
//       return;
// 
//     if (message.length() > 4000) {
//       Log.w(TAG, message.substring(0, 4000));
//       warning(message.substring(4000));
//     } else {
//       Log.w(TAG, message);
//     }
//   }
// 
//   /**
//    * Send an ERROR log message.
//    *
//    * @param message The message you would like logged.
//    */
//   public static void error(String message) {
//     if (LOG_LEVEL == LogLevel.NONE)
//       return;
// 
//     if (message.length() > 4000) {
//       Log.e(TAG, message.substring(0, 4000));
//       error(message.substring(4000));
//     } else {
//       Log.e(TAG, message);
//     }
//   }
// 
//   /**
//    * Send an INFO log message.
//    *
//    * @param message The message you would like logged.
//    */
//   public static void info(String message) {
//     if (LOG_LEVEL == LogLevel.NONE)
//       return;
// 
//     if (message.length() > 4000) {
//       Log.i(TAG, message.substring(0, 4000));
//       info(message.substring(4000));
//     } else {
//       Log.i(TAG, message);
//     }
//   }
// }


import com.mangopay.android.sdk.model.exception.MangoException;
import com.mangopay.android.sdk.util.PrintLog;
package com.mangopay.android.sdk.model;


/**
 * This model holds the card information
 */
public class MangoCard {

  private static final String CARD_NUMBER_REGEX = "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]" +
          "{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11})$";
  private static final String CARD_EXP_REGEX = "^(0[1-9]|1[0-2])[1-9][0-9]$";
  private static final String CARD_CVV_REGEX = "^[0-9]{3,4}$";

  private String cardNumber;
  private String expirationDate;
  private String cvx;

  public MangoCard(String cardNumber, String expirationDate, String cvx) {
    this.cardNumber = cardNumber;
    this.expirationDate = expirationDate;
    this.cvx = cvx;
  }

  public String getCardNumber() {
    return cardNumber;
  }

  public String getExpirationDate() {
    return expirationDate;
  }

  public String getCvx() {
    return cvx;
  }

  public void validate() throws MangoException {
    validateCardExpiration();
    validateCardNumber();
    validateCardCvx();
  }

  private void validateCardExpiration() {
    if (!isFieldValid(expirationDate, CARD_EXP_REGEX)) {
// Path: mangopay/src/main/java/com/mangopay/android/sdk/model/exception/MangoException.java
// public class MangoException extends RuntimeException {
// 
//   private String id;
//   private String type;
//   private long timestamp;
// 
//   public MangoException(Throwable throwable) {
//     super(throwable);
//     this.id = ErrorCode.SDK_ERROR.getValue();
//     this.timestamp = System.currentTimeMillis();
//   }
// 
//   public MangoException(String id, String message) {
//     this(id, message, null);
//   }
// 
//   public MangoException(String id, String message, String type) {
//     super(message);
//     this.id = id;
//     this.type = type;
//     this.timestamp = System.currentTimeMillis();
//   }
// 
//   public String getId() {
//     return id;
//   }
// 
//   public void setId(String id) {
//     this.id = id;
//   }
// 
//   public String getType() {
//     return type;
//   }
// 
//   public void setType(String type) {
//     this.type = type;
//   }
// 
//   public long getTimestamp() {
//     return timestamp;
//   }
// 
//   public void setTimestamp(long timestamp) {
//     this.timestamp = timestamp;
//   }
// 
//   @Override public boolean equals(Object o) {
//     if (this == o) return true;
//     if (o == null || getClass() != o.getClass()) return false;
// 
//     MangoException error = (MangoException) o;
// 
//     return !(id != null ? !id.equals(error.id) : error.id != null);
// 
//   }
// 
//   @Override public int hashCode() {
//     return id != null ? id.hashCode() : 0;
//   }
// 
//   @Override public String toString() {
//     return "MangoError{" +
//             "id='" + id + '\'' +
//             ", message='" + getMessage() + '\'' +
//             ", type='" + type + '\'' +
//             ", timestamp=" + timestamp +
//             '}';
//   }
// }
// 
// Path: mangopay/src/main/java/com/mangopay/android/sdk/util/PrintLog.java
// public final class PrintLog {
// 
//   private static final String TAG = "MangoPay";
//   private static LogLevel LOG_LEVEL = LogLevel.NONE;
// 
//   private PrintLog() {
//   }
// 
// 
//   /**
//    * Set the level of the logger: 'NONE' or 'FULL'. by default it's 'NONE'.
//    *
//    * @param level The level of the logger
//    */
//   public static void setLogLevel(LogLevel level) {
//     LOG_LEVEL = level;
//   }
// 
//   /**
//    * Send a DEBUG log message.
//    *
//    * @param message The message you would like logged.
//    */
//   public static void debug(String message) {
//     if (LOG_LEVEL == LogLevel.NONE)
//       return;
// 
//     if (message.length() > 4000) {
//       Log.d(TAG, message.substring(0, 4000));
//       debug(message.substring(4000));
//     } else {
//       Log.d(TAG, message);
//     }
//   }
// 
//   /**
//    * Send a WARN log message.
//    *
//    * @param message The message you would like logged.
//    */
//   public static void warning(String message) {
//     if (LOG_LEVEL == LogLevel.NONE)
//       return;
// 
//     if (message.length() > 4000) {
//       Log.w(TAG, message.substring(0, 4000));
//       warning(message.substring(4000));
//     } else {
//       Log.w(TAG, message);
//     }
//   }
// 
//   /**
//    * Send an ERROR log message.
//    *
//    * @param message The message you would like logged.
//    */
//   public static void error(String message) {
//     if (LOG_LEVEL == LogLevel.NONE)
//       return;
// 
//     if (message.length() > 4000) {
//       Log.e(TAG, message.substring(0, 4000));
//       error(message.substring(4000));
//     } else {
//       Log.e(TAG, message);
//     }
//   }
// 
//   /**
//    * Send an INFO log message.
//    *
//    * @param message The message you would like logged.
//    */
//   public static void info(String message) {
//     if (LOG_LEVEL == LogLevel.NONE)
//       return;
// 
//     if (message.length() > 4000) {
//       Log.i(TAG, message.substring(0, 4000));
//       info(message.substring(4000));
//     } else {
//       Log.i(TAG, message);
//     }
//   }
// }


// Path: mangopay/src/main/java/com/mangopay/android/sdk/model/MangoCard.java
import com.mangopay.android.sdk.model.exception.MangoException;
import com.mangopay.android.sdk.util.PrintLog;

package com.mangopay.android.sdk.model;


/**
 * This model holds the card information
 */
public class MangoCard {

  private static final String CARD_NUMBER_REGEX = "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]" +
          "{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11})$";
  private static final String CARD_EXP_REGEX = "^(0[1-9]|1[0-2])[1-9][0-9]$";
  private static final String CARD_CVV_REGEX = "^[0-9]{3,4}$";

  private String cardNumber;
  private String expirationDate;
  private String cvx;

  public MangoCard(String cardNumber, String expirationDate, String cvx) {
    this.cardNumber = cardNumber;
    this.expirationDate = expirationDate;
    this.cvx = cvx;
  }

  public String getCardNumber() {
    return cardNumber;
  }

  public String getExpirationDate() {
    return expirationDate;
  }

  public String getCvx() {
    return cvx;
  }

  public void validate() throws MangoException {
    validateCardExpiration();
    validateCardNumber();
    validateCardCvx();
  }

  private void validateCardExpiration() {
    if (!isFieldValid(expirationDate, CARD_EXP_REGEX)) {
      MangoException error = new MangoException(ErrorCode.EXPIRY_DATE_FORMAT_ERROR.getValue(),