// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "remoting/ios/facade/ios_oauth_token_getter.h"

#include "base/strings/sys_string_conversions.h"
#include "remoting/ios/facade/remoting_authentication.h"
#include "remoting/ios/facade/remoting_service.h"

namespace remoting {

IosOauthTokenGetter::IosOauthTokenGetter() : weak_factory_(this) {
  weak_ptr_ = weak_factory_.GetWeakPtr();
}

IosOauthTokenGetter::~IosOauthTokenGetter() {}

void IosOauthTokenGetter::CallWithToken(TokenCallback on_access_token) {
  __block TokenCallback block_callback = std::move(on_access_token);
  [RemotingService.instance.authentication
      callbackWithAccessToken:^(RemotingAuthenticationStatus status,
                                NSString* userEmail, NSString* accessToken) {
        Status oauth_status;
        switch (status) {
          case RemotingAuthenticationStatusSuccess:
            oauth_status = Status::SUCCESS;
            break;
          case RemotingAuthenticationStatusAuthError:
            oauth_status = Status::AUTH_ERROR;
            break;
          case RemotingAuthenticationStatusNetworkError:
            oauth_status = Status::NETWORK_ERROR;
            break;
          default:
            NOTREACHED();
        }
        std::move(block_callback)
            .Run(oauth_status, base::SysNSStringToUTF8(userEmail),
                 base::SysNSStringToUTF8(accessToken));
      }];
}

void IosOauthTokenGetter::InvalidateCache() {
  [RemotingService.instance.authentication invalidateCache];
}

base::WeakPtr<IosOauthTokenGetter> IosOauthTokenGetter::GetWeakPtr() {
  return weak_ptr_;
}

}  // namespace remoting
