package org.apereo.cas.configuration.model.support.oauth;

import org.apereo.cas.configuration.support.Beans;

/**
 * This is {@link OAuthProperties}.
 *
 * @author Misagh Moayyed
 * @since 5.0.0
 */
public class OAuthProperties {
    private Grants grants = new Grants();
    private Code code = new Code();
    private AccessToken accessToken = new AccessToken();
    private RefreshToken refreshToken = new RefreshToken();
    private String throttler = "neverThrottle";

    public Grants getGrants() {
        return grants;
    }

    public void setGrants(final Grants grants) {
        this.grants = grants;
    }

    public AccessToken getAccessToken() {
        return accessToken;
    }

    public void setAccessToken(final AccessToken accessToken) {
        this.accessToken = accessToken;
    }

    public RefreshToken getRefreshToken() {
        return refreshToken;
    }

    public void setRefreshToken(final RefreshToken refreshToken) {
        this.refreshToken = refreshToken;
    }

    public Code getCode() {
        return code;
    }

    public void setCode(final Code code) {
        this.code = code;
    }

    public String getThrottler() {
        return throttler;
    }

    public void setThrottler(final String throttler) {
        this.throttler = throttler;
    }

    public static class Code {
        private int numberOfUses = 1;
        private long timeToKillInSeconds = 30;

        public int getNumberOfUses() {
            return numberOfUses;
        }

        public void setNumberOfUses(final int numberOfUses) {
            this.numberOfUses = numberOfUses;
        }

        public long getTimeToKillInSeconds() {
            return timeToKillInSeconds;
        }

        public void setTimeToKillInSeconds(final long timeToKillInSeconds) {
            this.timeToKillInSeconds = timeToKillInSeconds;
        }
    }

    public static class AccessToken {
        private String maxTimeToLiveInSeconds = "PT28800S";
        private String timeToKillInSeconds = "PT7200S";
        private boolean releaseProtocolAttributes = true;

        public boolean isReleaseProtocolAttributes() {
            return releaseProtocolAttributes;
        }

        public void setReleaseProtocolAttributes(final boolean releaseProtocolAttributes) {
            this.releaseProtocolAttributes = releaseProtocolAttributes;
        }

        public long getMaxTimeToLiveInSeconds() {
            return Beans.newDuration(maxTimeToLiveInSeconds).getSeconds();
        }

        public void setMaxTimeToLiveInSeconds(final String maxTimeToLiveInSeconds) {
            this.maxTimeToLiveInSeconds = maxTimeToLiveInSeconds;
        }

        public long getTimeToKillInSeconds() {
            return Beans.newDuration(timeToKillInSeconds).getSeconds();
        }

        public void setTimeToKillInSeconds(final String timeToKillInSeconds) {
            this.timeToKillInSeconds = timeToKillInSeconds;
        }
    }

    public static class RefreshToken {
        private String timeToKillInSeconds = "P14D";

        public long getTimeToKillInSeconds() {
            return Beans.newDuration(timeToKillInSeconds).getSeconds();
        }

        public void setTimeToKillInSeconds(final String timeToKillInSeconds) {
            this.timeToKillInSeconds = timeToKillInSeconds;
        }
    }
    
    public static class Grants {
        private ResourceOwner resourceOwner = new ResourceOwner();

        public ResourceOwner getResourceOwner() {
            return resourceOwner;
        }

        public void setResourceOwner(final ResourceOwner resourceOwner) {
            this.resourceOwner = resourceOwner;
        }

        public static class ResourceOwner {
            private boolean requireServiceHeader;

            public boolean isRequireServiceHeader() {
                return requireServiceHeader;
            }

            public void setRequireServiceHeader(final boolean requireServiceHeader) {
                this.requireServiceHeader = requireServiceHeader;
            }
        }
    }
}

