// Copyright 2019 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:googleapis_auth/googleapis_auth.dart';
import 'package:json_annotation/json_annotation.dart';

part 'service_account_info.g.dart';

/// Class that represents authentication information that enables callers to
/// execute environment-specific tasks on behalf of their apps.
///
/// See also:
///
///  * <https://cloud.google.com/appengine/docs/flexible/python/service-account>
///
///  * `package:googleapis_auth`, which can make use of the service account
///    information to obtain an OAuth 2.0 access token on behalf of the
///    application.
@JsonSerializable()
class ServiceAccountInfo {
  /// Creates a new [ServiceAccountInfo] object.
  const ServiceAccountInfo({
    this.type,
    this.projectId,
    this.privateKeyId,
    this.privateKey,
    this.email,
    this.clientId,
    this.authUrl,
    this.tokenUrl,
    this.authCertUrl,
    this.clientCertUrl,
  });

  /// Create a new [ServiceAccountInfo] object from its JSON representation.
  factory ServiceAccountInfo.fromJson(Map<String, dynamic> json) => _$ServiceAccountInfoFromJson(json);

  @JsonKey(name: 'type')
  final String? type;

  @JsonKey(name: 'project_id')
  final String? projectId;

  @JsonKey(name: 'private_key_id')
  final String? privateKeyId;

  @JsonKey(name: 'private_key')
  final String? privateKey;

  @JsonKey(name: 'client_email')
  final String? email;

  @JsonKey(name: 'client_id')
  final String? clientId;

  @JsonKey(name: 'auth_uri')
  final String? authUrl;

  @JsonKey(name: 'token_uri')
  final String? tokenUrl;

  @JsonKey(name: 'auth_provider_x509_cert_url')
  final String? authCertUrl;

  @JsonKey(name: 'client_x509_cert_url')
  final String? clientCertUrl;

  /// Serializes this object to a JSON primitive.
  Map<String, dynamic> toJson() => _$ServiceAccountInfoToJson(this);

  /// Returns this object in its [ServiceAccountCredentials] form.
  ServiceAccountCredentials asServiceAccountCredentials() {
    return ServiceAccountCredentials(email!, ClientId(clientId!, null), privateKey!);
  }
}
