#ifndef COMPONENTS_COMMERCE_CORE_COMMERCE_HEURISTICS_DATA_H_
#define COMPONENTS_COMMERCE_CORE_COMMERCE_HEURISTICS_DATA_H_
#include <string>
#include "base/time/time.h"
#include "base/values.h"
#include "base/version.h"
#include "third_party/re2/src/re2/re2.h"
namespace commerce_heuristics {
class CommerceHeuristicsData {
public:
static CommerceHeuristicsData& GetInstance();
CommerceHeuristicsData();
CommerceHeuristicsData(const CommerceHeuristicsData&) = delete;
CommerceHeuristicsData& operator=(const CommerceHeuristicsData&) = delete;
~CommerceHeuristicsData();
void UpdateVersion(base::Version version);
const std::string GetVersion();
bool PopulateDataFromComponent(const std::string& hint_json_data,
const std::string& global_json_data,
const std::string& product_id_json_data,
const std::string& cart_extraction_script);
std::optional<std::string> GetMerchantName(const std::string& domain);
std::optional<std::string> GetMerchantCartURL(const std::string& domain);
std::optional<std::string> GetHintHeuristicsJSONForDomain(
const std::string& domain);
std::optional<std::string> GetGlobalHeuristicsJSON();
const re2::RE2* GetProductSkipPattern();
const re2::RE2* GetRuleDiscountPartnerMerchantPattern();
const re2::RE2* GetCouponDiscountPartnerMerchantPattern();
const re2::RE2* GetNoDiscountMerchantPattern();
const re2::RE2* GetCartPageURLPattern();
const re2::RE2* GetCheckoutPageURLPattern();
const re2::RE2* GetPurchaseButtonTextPattern();
const re2::RE2* GetAddToCartRequestPattern();
const re2::RE2* GetCartPageURLPatternForDomain(const std::string& domain);
const re2::RE2* GetCheckoutPageURLPatternForDomain(const std::string& domain);
const re2::RE2* GetPurchasePageURLPatternForDomain(const std::string& domain);
const re2::RE2* GetSkipAddToCartPatternForDomain(const std::string& domain);
std::string GetProductIDExtractionJSON();
std::string GetCartProductExtractionScript();
std::optional<base::TimeDelta> GetDiscountFetchDelay();
private:
friend class CommerceHeuristicsDataTest;
std::optional<std::string> GetCommerceHintHeuristics(
const std::string& type,
const std::string& domain);
std::optional<std::string> GetCommerceGlobalHeuristics(
const std::string& type);
const re2::RE2* GetCommerceHintHeuristicsRegex(
std::map<std::string, std::unique_ptr<re2::RE2>>& map,
const std::string type,
const std::string domain);
std::unique_ptr<re2::RE2> ConstructGlobalRegex(const std::string& type);
base::Version version_;
base::Value::Dict hint_heuristics_;
base::Value::Dict global_heuristics_;
std::string global_heuristics_string_;
std::unique_ptr<re2::RE2> product_skip_pattern_;
std::unique_ptr<re2::RE2> rule_discount_partner_merchant_pattern_;
std::unique_ptr<re2::RE2> coupon_discount_partner_merchant_pattern_;
std::unique_ptr<re2::RE2> no_discount_merchant_pattern_;
std::unique_ptr<re2::RE2> cart_url_pattern_;
std::unique_ptr<re2::RE2> checkout_url_pattern_;
std::unique_ptr<re2::RE2> purchase_button_pattern_;
std::unique_ptr<re2::RE2> add_to_cart_request_pattern_;
std::map<std::string, std::unique_ptr<re2::RE2>>
domain_cart_url_pattern_mapping_;
std::map<std::string, std::unique_ptr<re2::RE2>>
domain_checkout_url_pattern_mapping_;
std::map<std::string, std::unique_ptr<re2::RE2>>
domain_purchase_url_pattern_mapping_;
std::map<std::string, std::unique_ptr<re2::RE2>>
domain_skip_add_to_cart_pattern_mapping_;
std::string product_id_json_;
std::string cart_extraction_script_;
};
}
#endif