// Path: library/src/main/java/rxreddit/model/AccessToken.java
// public abstract class AccessToken {
// 
//     private final long createdMs = System.currentTimeMillis();
//     @SerializedName("access_token")
//     String token;
//     @SerializedName("token_type")
//     String tokenType;
//     @SerializedName("expires_in")
//     long secondsToExpiration;
//     @SerializedName("scope")
//     String scope;
//     @SerializedName("refresh_token")
//     String refreshToken;
//     private long expirationUtcMs;
// 
//     public String getToken() {
//         return token;
//     }
// 
//     public void setToken(String token) {
//         this.token = token;
//     }
// 
//     public String getTokenType() {
//         return tokenType;
//     }
// 
//     public void setTokenType(String tokenType) {
//         this.tokenType = tokenType;
//     }
// 
//     public long getExpirationMs() {
//         if (expirationUtcMs == 0) {
//             expirationUtcMs = secondsToExpiration * 1000 + createdMs;
//         }
//         return expirationUtcMs;
//     }
// 
//     public void setExpiration(long expiration) {
//         this.expirationUtcMs = expiration;
//     }
// 
//     public String getScope() {
//         return scope;
//     }
// 
//     public void setScope(String scope) {
//         this.scope = scope;
//     }
// 
//     public String getRefreshToken() {
//         return refreshToken;
//     }
// 
//     public void setRefreshToken(String refreshToken) {
//         this.refreshToken = refreshToken;
//     }
// 
//     public long secondsUntilExpiration() {
//         final long secondsUntilExpiration = (getExpirationMs() - System.currentTimeMillis()) / 1000;
//         return Math.max(0, secondsUntilExpiration);
//     }
// 
//     public abstract boolean isUserAccessToken();
// }
// 
// Path: library/src/main/java/rxreddit/model/UserAccessToken.java
// public class UserAccessToken extends AccessToken {
// 
//     @Override
//     public boolean isUserAccessToken() {
//         return true;
//     }
// 
//     @Override
//     public String toString() {
//         return String.format(
//                 "Access Token: %s - Expires: %s",
//                 (isUserAccessToken() ? "User" : "Application"),
//                 new Date(getExpirationMs())
//         );
//     }
// }


import io.reactivex.rxjava3.core.Completable;
import io.reactivex.rxjava3.core.Observable;
import rxreddit.model.AccessToken;
import rxreddit.model.UserAccessToken;
package rxreddit.api;


interface IRedditAuthService {

    String getRedirectUri();

    String getAuthorizationUrl();

    Observable<UserAccessToken> onAuthCodeReceived(String authCode, String state);

    boolean isUserAuthorized();

// Path: library/src/main/java/rxreddit/model/AccessToken.java
// public abstract class AccessToken {
// 
//     private final long createdMs = System.currentTimeMillis();
//     @SerializedName("access_token")
//     String token;
//     @SerializedName("token_type")
//     String tokenType;
//     @SerializedName("expires_in")
//     long secondsToExpiration;
//     @SerializedName("scope")
//     String scope;
//     @SerializedName("refresh_token")
//     String refreshToken;
//     private long expirationUtcMs;
// 
//     public String getToken() {
//         return token;
//     }
// 
//     public void setToken(String token) {
//         this.token = token;
//     }
// 
//     public String getTokenType() {
//         return tokenType;
//     }
// 
//     public void setTokenType(String tokenType) {
//         this.tokenType = tokenType;
//     }
// 
//     public long getExpirationMs() {
//         if (expirationUtcMs == 0) {
//             expirationUtcMs = secondsToExpiration * 1000 + createdMs;
//         }
//         return expirationUtcMs;
//     }
// 
//     public void setExpiration(long expiration) {
//         this.expirationUtcMs = expiration;
//     }
// 
//     public String getScope() {
//         return scope;
//     }
// 
//     public void setScope(String scope) {
//         this.scope = scope;
//     }
// 
//     public String getRefreshToken() {
//         return refreshToken;
//     }
// 
//     public void setRefreshToken(String refreshToken) {
//         this.refreshToken = refreshToken;
//     }
// 
//     public long secondsUntilExpiration() {
//         final long secondsUntilExpiration = (getExpirationMs() - System.currentTimeMillis()) / 1000;
//         return Math.max(0, secondsUntilExpiration);
//     }
// 
//     public abstract boolean isUserAccessToken();
// }
// 
// Path: library/src/main/java/rxreddit/model/UserAccessToken.java
// public class UserAccessToken extends AccessToken {
// 
//     @Override
//     public boolean isUserAccessToken() {
//         return true;
//     }
// 
//     @Override
//     public String toString() {
//         return String.format(
//                 "Access Token: %s - Expires: %s",
//                 (isUserAccessToken() ? "User" : "Application"),
//                 new Date(getExpirationMs())
//         );
//     }
// }


// Path: library/src/main/java/rxreddit/api/IRedditAuthService.java
import io.reactivex.rxjava3.core.Completable;
import io.reactivex.rxjava3.core.Observable;
import rxreddit.model.AccessToken;
import rxreddit.model.UserAccessToken;

package rxreddit.api;


interface IRedditAuthService {

    String getRedirectUri();

    String getAuthorizationUrl();

    Observable<UserAccessToken> onAuthCodeReceived(String authCode, String state);

    boolean isUserAuthorized();

    AccessToken getAccessToken();