/*
 *
 * Copyright 2015 gRPC authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

#import <objc/runtime.h>

#import "GRPCCall+OAuth2.h"

static NSString * const kAuthorizationHeader = @"authorization";
static NSString * const kBearerPrefix = @"Bearer ";
static NSString * const kChallengeHeader = @"www-authenticate";

@implementation GRPCCall (OAuth2)
@dynamic tokenProvider;

- (NSString *)oauth2AccessToken {
  NSString *headerValue = self.requestHeaders[kAuthorizationHeader];
  if ([headerValue hasPrefix:kBearerPrefix]) {
    return [headerValue substringFromIndex:kBearerPrefix.length];
  } else {
    return nil;
  }
}

- (void)setOauth2AccessToken:(NSString *)token {
  if (token) {
    self.requestHeaders[kAuthorizationHeader] = [kBearerPrefix stringByAppendingString:token];
  } else {
    [self.requestHeaders removeObjectForKey:kAuthorizationHeader];
  }
}

- (NSString *)oauth2ChallengeHeader {
  return self.responseHeaders[kChallengeHeader];
}

- (void)setTokenProvider:(id<GRPCAuthorizationProtocol>)tokenProvider {
  objc_setAssociatedObject(self, @selector(tokenProvider), tokenProvider, OBJC_ASSOCIATION_RETAIN);
}

- (id<GRPCAuthorizationProtocol>)tokenProvider {
  return objc_getAssociatedObject(self, @selector(tokenProvider));
}

@end
