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

#ifndef COMPONENTS_COMMERCE_IOS_BROWSER_WEB_STATE_WRAPPER_H_
#define COMPONENTS_COMMERCE_IOS_BROWSER_WEB_STATE_WRAPPER_H_

#include <string>

#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "components/commerce/core/web_wrapper.h"
#include "ios/web/public/web_state.h"

class GURL;

namespace base {
class Value;
}  // namespace base

namespace commerce {

// A WebWrapper backed by web::WebState.
class WebStateWrapper : public WebWrapper {
 public:
  explicit WebStateWrapper(web::WebState* web_state);
  WebStateWrapper(const WebStateWrapper&) = delete;
  WebStateWrapper operator=(const WebStateWrapper&) = delete;
  ~WebStateWrapper() override;

  const GURL& GetLastCommittedURL() const override;

  const std::u16string& GetTitle() override;

  bool IsFirstLoadForNavigationFinished() override;

  void SetIsFirstLoadForNavigationFinished(bool finished);

  bool IsOffTheRecord() override;

  void RunJavascript(
      const std::u16string& script,
      base::OnceCallback<void(const base::Value)> callback) override;

  ukm::SourceId GetPageUkmSourceId() override;

  base::WeakPtr<WebWrapper> GetWeakPtr();

  void ClearWebStatePointer();

 private:
  raw_ptr<web::WebState> web_state_;

  // Whether the first load after a navigation has completed. This is useful
  // when dealing with single-page apps that may not fire subsequent load
  // events.
  bool is_first_load_for_nav_finished_{false};
};

}  // namespace commerce

#endif  // COMPONENTS_COMMERCE_IOS_BROWSER_WEB_STATE_WRAPPER_H_
