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

#include "chrome/browser/webid/identity_provider_permission_request.h"

#include <variant>

#include "base/functional/callback_helpers.h"
#include "components/permissions/permission_decision.h"
#include "components/permissions/permission_prompt_decision.h"
#include "components/permissions/request_type.h"
#include "third_party/blink/public/mojom/permissions/permission.mojom-shared.h"

IdentityProviderPermissionRequest::IdentityProviderPermissionRequest(
    const url::Origin& origin,
    base::OnceCallback<void(bool accepted)> callback)
    : PermissionRequest(
          std::make_unique<permissions::PermissionRequestData>(
              permissions::RequestType::kIdentityProvider,
              /*user_gesture=*/true,
              origin.GetURL()),
          base::BindRepeating(
              &IdentityProviderPermissionRequest::PermissionDecided,
              base::Unretained(this))),
      callback_(std::move(callback)) {}

IdentityProviderPermissionRequest::~IdentityProviderPermissionRequest() =
    default;

void IdentityProviderPermissionRequest::PermissionDecided(
    const permissions::PermissionPromptDecision& decision,
    const permissions::PermissionRequestData& request_data) {
  DCHECK(decision.overall_decision != PermissionDecision::kAllowThisTime);
  CHECK(std::holds_alternative<std::monostate>(decision.prompt_options));
  DCHECK(decision.is_final);

  if (decision.overall_decision == PermissionDecision::kAllow) {
    std::move(callback_).Run(true);
  } else if (decision.overall_decision == PermissionDecision::kDeny) {
    std::move(callback_).Run(false);
  } else {
    DCHECK_EQ(PermissionDecision::kNone, decision.overall_decision);
    std::move(callback_).Run(false);
  }
}
