package com.paymill.models;
import org.apache.commons.lang3.StringUtils;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonValue;
public class Interval {
public static Interval.Period period( Integer interval, Unit unit ) {
return new Interval.Period( interval, unit );
}
public static Interval.PeriodWithChargeDay periodWithChargeDay( Integer interval, Unit unit, Weekday weekday ) {
return new Interval.PeriodWithChargeDay( interval, unit, weekday );
}
public static Interval.PeriodWithChargeDay periodWithChargeDay( Integer interval, Unit unit ) {
return new Interval.PeriodWithChargeDay( interval, unit, null );
}
@JsonIgnoreProperties( ignoreUnknown = true )
public static class Period {
private Integer interval;
private Unit unit;
public Period( final String interval ) {
try {
String[] intervalParts = StringUtils.split( interval );
this.interval = Integer.parseInt( intervalParts[0] );
this.unit = Unit.create( intervalParts[1] );
} catch( ArrayIndexOutOfBoundsException e ) {
throw new IllegalArgumentException( "Invalid period:" + interval );
}
}
private Period( Integer interval, Unit unit ) {
this.interval = interval;
this.unit = unit;
}
public Integer getInterval() {
return interval;
}
public void setInterval( Integer interval ) {
this.interval = interval;
}
public Unit getUnit() {
return unit;
}
public void setUnit( Unit unit ) {
this.unit = unit;
}
@Override
public String toString() {
return this.interval + " " + this.unit;
}
}
@JsonIgnoreProperties( ignoreUnknown = true )
public static class PeriodWithChargeDay {
private Integer interval;
private Unit unit;
private Weekday weekday;
public PeriodWithChargeDay( String interval ) {
super();
try {
String[] weekdayParts = StringUtils.split( interval, ',' );
if( weekdayParts.length > 1 ) {
this.weekday = Weekday.create( weekdayParts[1] );
}
String[] intervalParts = StringUtils.split( weekdayParts[0] );
this.interval = Integer.parseInt( intervalParts[0] );
this.unit = Unit.create( intervalParts[1] );
} catch( ArrayIndexOutOfBoundsException e ) {
throw new IllegalArgumentException( "Invalid period:" + interval );
}
}
private PeriodWithChargeDay( Integer interval, Unit unit, Weekday weekday ) {
this.interval = interval;
this.unit = unit;
this.weekday = weekday;
}
/**
* The weekday
* @return the weekday or <code>null</code>, if none was defined
*/
public Weekday getWeekday() {
return weekday;
}
public void setWeekday( Weekday weekday ) {
this.weekday = weekday;
}
public Integer getInterval() {
return interval;
}
public void setInterval( Integer interval ) {
this.interval = interval;
}
public Unit getUnit() {
return unit;
}
public void setUnit( Unit unit ) {
this.unit = unit;
}
@Override
public String toString() {
return (getWeekday() == null) ? this.interval + " " + this.unit : this.interval + " " + this.unit + "," + getWeekday();
}
}
public enum Unit {
DAY("DAY"), WEEK("WEEK"), MONTH("MONTH"), YEAR("YEAR");
private String value;
private Unit( final String value ) {
this.value = value;
}
@JsonValue
public String getValue() {
return this.value;
}
@JsonCreator
public static Unit create( final String value ) {
for( Unit unit : Unit.values() ) {
if( unit.getValue().equals( value.toUpperCase() ) ) {
return unit;
}
}
throw new IllegalArgumentException( "Invalid value for Interval.Unit:" + value );
}
@Override
public String toString() {
return this.value;
}
}
public enum Weekday {
MONDAY("MONDAY"), TUESDAY("TUESDAY"), WEDNESDAY("WEDNESDAY"), THURSDAY("THURSDAY"), FRIDAY("FRIDAY"), SATURDAY("SATURDAY"), SUNDAY("SUNDAY");
private String value;
private Weekday( final String value ) {
this.value = value;
}
@JsonValue
public String getValue() {
return this.value;
}
@JsonCreator
public static Weekday create( final String value ) {
for( Weekday weekday : Weekday.values() ) {
if( weekday.getValue().equals( value.toUpperCase() ) ) {
return weekday;
}
}
throw new IllegalArgumentException( "Invalid value for Interval.Weekday" + value );
}
@Override
public String toString() {
return this.value;
}
}
}