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

#ifndef IOS_WEB_FIND_IN_PAGE_FIND_IN_PAGE_MANAGER_IMPL_H_
#define IOS_WEB_FIND_IN_PAGE_FIND_IN_PAGE_MANAGER_IMPL_H_

#include <list>
#include <map>
#include <string>

#include "base/memory/weak_ptr.h"
#import "ios/web/public/find_in_page/find_in_page_manager.h"
#include "ios/web/public/web_state/web_state_observer.h"

namespace web {

class WebState;
class WebFrame;

class FindInPageManagerImpl : public FindInPageManager,
                              public web::WebStateObserver {
 public:
  explicit FindInPageManagerImpl(web::WebState* web_state);
  ~FindInPageManagerImpl() override;

  static void CreateForWebState(WebState* web_state);

  // FindInPageManager overrides
  void Find(NSString* query, FindInPageOptions options) override;
  void StopFinding() override;
  FindInPageManagerDelegate* GetDelegate() override;
  void SetDelegate(FindInPageManagerDelegate* delegate) override;

 private:
  friend class web::WebStateUserData<FindInPageManagerImpl>;
  // Keeps track of the state of an ongoing Find() request.
  struct FindRequest {
    FindRequest();
    ~FindRequest();
    int GetTotalMatchCount() const;
    // Unique identifier for each find used to check that it is the most recent
    // find. This ensures that an old find doesn't decrement
    // |pending_frame_calls_count| after it has been reset by the new find.
    int unique_id = 0;
    // Counter to keep track of pending frame JavaScript calls.
    int pending_frame_call_count = 0;
    // Holds number of matches found for each frame keyed by frame_id.
    std::map<std::string, int> frame_match_count;
    // List of frame_ids used for sorting matches.
    std::list<std::string> frame_order;
  };

  // Determines whether find is finished. If not, calls pumpSearch to continue.
  // If it is, calls UpdateFrameMatchesCount(). If find returned null, then does
  // nothing more.
  void ProcessFindInPageResult(const std::string& query,
                               const std::string& frame_id,
                               const int request_id,
                               const base::Value* result);

  // WebStateObserver overrides
  void WebFrameDidBecomeAvailable(WebState* web_state,
                                  WebFrame* web_frame) override;
  void WebFrameWillBecomeUnavailable(WebState* web_state,
                                     WebFrame* web_frame) override;
  void WebStateDestroyed(WebState* web_state) override;

  // Holds the state of the most recent find in page request.
  FindRequest last_find_request_;
  FindInPageManagerDelegate* delegate_ = nullptr;
  web::WebState* web_state_ = nullptr;
  base::WeakPtrFactory<FindInPageManagerImpl> weak_factory_;
};
}  // namespace web

#endif  // IOS_WEB_FIND_IN_PAGE_FIND_IN_PAGE_MANAGER_IMPL_H_
