module OAuth2
  module Strategy
    class Base
      def initialize: (OAuth2::Client) -> void
    end

    class AuthCode < Base
      def authorize_params: (?Hash[untyped, untyped]) -> Hash[untyped, untyped]
      def authorize_url: (?Hash[untyped, untyped]) -> String
      def get_token: (String, ?Hash[untyped, untyped], ?Hash[Symbol, untyped]) -> OAuth2::AccessToken
    end

    class Implicit < Base
      def authorize_params: (?Hash[untyped, untyped]) -> Hash[untyped, untyped]
      def authorize_url: (?Hash[untyped, untyped]) -> String
      def get_token: (*untyped) -> void
    end

    class Password < Base
      def authorize_url: () -> void
      def get_token: (String, String, ?Hash[untyped, untyped], ?Hash[Symbol, untyped]) -> OAuth2::AccessToken
    end

    class ClientCredentials < Base
      def authorize_url: () -> void
      def get_token: (?Hash[untyped, untyped], ?Hash[Symbol, untyped]) -> OAuth2::AccessToken
    end

    class Assertion < Base
      def authorize_url: () -> void
      def get_token: (Hash[untyped, untyped], Hash[Symbol, untyped], ?Hash[Symbol, untyped], ?Hash[Symbol, untyped]) -> OAuth2::AccessToken
    end
  end
end
