// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.its;

import org.bouncycastle.oer.its.ieee1609dot2.basetypes.Time32;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.Duration;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.ValidityPeriod;
import java.util.Date;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.UINT16;

public class ITSValidityPeriod
{
    private final long startDate;
    private final UINT16 duration;
    private final Unit timeUnit;
    
    public static Builder from(final Date date) {
        return new Builder(date);
    }
    
    public ITSValidityPeriod(final ValidityPeriod validityPeriod) {
        this.startDate = validityPeriod.getStart().getValue().longValue();
        final Duration duration = validityPeriod.getDuration();
        this.duration = duration.getDuration();
        this.timeUnit = Unit.values()[duration.getChoice()];
    }
    
    ITSValidityPeriod(final long startDate, final UINT16 duration, final Unit timeUnit) {
        this.startDate = startDate;
        this.duration = duration;
        this.timeUnit = timeUnit;
    }
    
    public Date getStartDate() {
        return new Date(this.startDate);
    }
    
    public ValidityPeriod toASN1Structure() {
        return ValidityPeriod.builder().setStart(new Time32(this.startDate / 1000L)).setDuration(new Duration(this.timeUnit.unitTag, this.duration)).createValidityPeriod();
    }
    
    public static class Builder
    {
        private final long startDate;
        
        Builder(final Date date) {
            this.startDate = date.getTime();
        }
        
        public ITSValidityPeriod plusYears(final int n) {
            return new ITSValidityPeriod(this.startDate, UINT16.valueOf(n), Unit.years);
        }
        
        public ITSValidityPeriod plusSixtyHours(final int n) {
            return new ITSValidityPeriod(this.startDate, UINT16.valueOf(n), Unit.sixtyHours);
        }
    }
    
    public enum Unit
    {
        microseconds(0), 
        milliseconds(1), 
        seconds(2), 
        minutes(3), 
        hours(4), 
        sixtyHours(5), 
        years(6);
        
        private final int unitTag;
        
        private Unit(final int unitTag) {
            this.unitTag = unitTag;
        }
    }
}
