// Code generated by sidekick. DO NOT EDIT.
//
// Copyright 2026 Google LLC
//
// 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
//
//     https://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 Foundation
import GoogleCloudWkt

/// Settings on a Project/Folder/Organization related to Access Approval.
public struct AccessApprovalSettings: Codable, Equatable, GoogleCloudWkt._AnyPackable,
  Sendable
{
  /// The resource name of the settings. Format is one of:
  ///
  ///   * "projects/{project}/accessApprovalSettings"
  ///   * "folders/{folder}/accessApprovalSettings"
  ///   * "organizations/{organization}/accessApprovalSettings"
  public var name: Swift.String = Swift.String()

  /// A list of email addresses to which notifications relating to approval
  /// requests should be sent. Notifications relating to a resource will be sent
  /// to all emails in the settings of ancestor resources of that resource. A
  /// maximum of 50 email addresses are allowed.
  public var notificationEmails: [Swift.String] = []

  /// A list of Google Cloud Services for which the given resource has Access
  /// Approval enrolled. Access requests for the resource given by name against
  /// any of these services contained here will be required to have explicit
  /// approval. If name refers to an organization, enrollment can be done for
  /// individual services. If name refers to a folder or project, enrollment can
  /// only be done on an all or nothing basis.
  ///
  /// If a cloud_product is repeated in this list, the first entry will be
  /// honored and all following entries will be discarded. A maximum of 10
  /// enrolled services will be enforced, to be expanded as the set of supported
  /// services is expanded.
  public var enrolledServices: [EnrolledService] = []

  /// Output only. This field is read only (not settable via
  /// UpdateAccessApprovalSettings method). If the field is true, that
  /// indicates that at least one service is enrolled for Access Approval in one
  /// or more ancestors of the Project or Folder (this field will always be
  /// unset for the organization since organizations do not have ancestors).
  public var enrolledAncestor: Swift.Bool = Swift.Bool()

  /// The asymmetric crypto key version to use for signing approval requests.
  /// Empty active_key_version indicates that a Google-managed key should be used
  /// for signing. This property will be ignored if set by an ancestor of this
  /// resource, and new non-empty values may not be set.
  public var activeKeyVersion: Swift.String = Swift.String()

  /// Output only. This field is read only (not settable via UpdateAccessApprovalSettings
  /// method). If the field is true, that indicates that an ancestor of this
  /// Project or Folder has set active_key_version (this field will always be
  /// unset for the organization since organizations do not have ancestors).
  public var ancestorHasActiveKeyVersion: Swift.Bool = Swift.Bool()

  /// Output only. This field is read only (not settable via UpdateAccessApprovalSettings
  /// method). If the field is true, that indicates that there is some
  /// configuration issue with the active_key_version configured at this level in
  /// the resource hierarchy (e.g. it doesn't exist or the Access Approval
  /// service account doesn't have the correct permissions on it, etc.) This key
  /// version is not necessarily the effective key version at this level, as key
  /// versions are inherited top-down.
  public var invalidKeyVersion: Swift.Bool = Swift.Bool()

  /// Initialize a new instance of `AccessApprovalSettings`.
  public init() {}

  /// Use `config` to return a new instance of this object, with some fields updated.
  ///
  /// Commonly used to initialize the value, for example:
  ///
  /// ```
  /// let value = AccessApprovalSettings().with { $0.name = ... }
  /// ```
  public func with(_ config: (inout Self) throws -> Swift.Void) rethrows -> Self {
    var copy = self
    try config(&copy)
    return copy
  }

  public static var _anyTypeUrl: Swift.String {
    return "type.googleapis.com/google.cloud.accessapproval.v1.AccessApprovalSettings"
  }
  public init(fromAny any: GoogleCloudWkt.`Any`) throws {
    self = try GoogleCloudWkt._slowAnyDeserialize(Self.self, from: any)
  }
  public func _pack() throws -> GoogleCloudWkt.Struct {
    return try GoogleCloudWkt._slowAnySerialize(message: self)
  }
}
