/**
 * OAuth
 * Response data when oauth request.
 **/
namespace OAuth {
  export type AppDataFromServer = {
    id: string
    name: string
    website: string | null
    redirect_uri: string
    client_id: string
    client_secret: string
  }

  export type TokenDataFromServer = {
    access_token: string
    token_type: string
    scope: string
    created_at: number
    expires_in: number | null
    refresh_token: string | null
  }

  export class AppData {
    public url: string | null
    public session_token: string | null
    constructor(
      public id: string,
      public name: string,
      public website: string | null,
      public redirect_uri: string,
      public client_id: string,
      public client_secret: string
    ) {
      this.url = null
      this.session_token = null
    }

    /**
     * Serialize raw application data from server
     * @param raw from server
     */
    static from(raw: AppDataFromServer) {
      return new this(raw.id, raw.name, raw.website, raw.redirect_uri, raw.client_id, raw.client_secret)
    }

    get redirectUri() {
      return this.redirect_uri
    }
    get clientId() {
      return this.client_id
    }
    get clientSecret() {
      return this.client_secret
    }
  }

  export class TokenData {
    public _scope: string
    constructor(
      public access_token: string,
      public token_type: string,
      scope: string,
      public created_at: number,
      public expires_in: number | null = null,
      public refresh_token: string | null = null
    ) {
      this._scope = scope
    }

    /**
     * Serialize raw token data from server
     * @param raw from server
     */
    static from(raw: TokenDataFromServer) {
      return new this(raw.access_token, raw.token_type, raw.scope, raw.created_at, raw.expires_in, raw.refresh_token)
    }

    /**
     * OAuth Aceess Token
     */
    get accessToken() {
      return this.access_token
    }
    get tokenType() {
      return this.token_type
    }
    get scope() {
      return this._scope
    }
    /**
     * Application ID
     */
    get createdAt() {
      return this.created_at
    }
    get expiresIn() {
      return this.expires_in
    }
    /**
     * OAuth Refresh Token
     */
    get refreshToken() {
      return this.refresh_token
    }
  }
}

export default OAuth