// 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.
//

#include "generator/generator.h"

#include <utility>

#include "absl/status/statusor.h"
#include "absl/synchronization/notification.h"
#include "async/async_context.h"
#include "proto/generator.pb.h"

namespace credentio {

absl::StatusOr<GenerateManifestStoreResponse>
ManifestStoreGenerator::GenerateManifestStore(
    GenerateManifestStoreRequest request) const {
  absl::Notification done;
  absl::StatusOr<GenerateManifestStoreResponse> result;
  GenerateManifestStore(std::move(request), AsyncContext(),
                        [&](absl::StatusOr<GenerateManifestStoreResponse> r) {
                          result = std::move(r);
                          done.Notify();
                        });
  done.WaitForNotification();
  return result;
}

absl::StatusOr<ManifestStoreTemplate>
ManifestStoreGenerator::GenerateManifestStoreTemplate(
    GenerateManifestStoreRequest request) const {
  absl::Notification done;
  absl::StatusOr<ManifestStoreTemplate> result;
  GenerateManifestStoreTemplate(std::move(request), AsyncContext(),
                                [&](absl::StatusOr<ManifestStoreTemplate> r) {
                                  result = std::move(r);
                                  done.Notify();
                                });
  done.WaitForNotification();
  return result;
}

absl::StatusOr<FinalizeManifestStoreResponse>
ManifestStoreGenerator::FinalizeManifestStore(
    FinalizeManifestStoreRequest request) const {
  absl::Notification done;
  absl::StatusOr<FinalizeManifestStoreResponse> result;
  FinalizeManifestStore(std::move(request), AsyncContext(),
                        [&](absl::StatusOr<FinalizeManifestStoreResponse> r) {
                          result = std::move(r);
                          done.Notify();
                        });
  done.WaitForNotification();
  return result;
}

}  // namespace credentio
