// Copyright 2012 Google Inc. All Rights Reserved.
// Use of this source code is governed by an Apache-style license that can be
// found in the COPYING file.

// The methods in this file belong conceptually to rlz_lib.cc. However, some
// programs depend on rlz only to call ClearAllProductEvents(), so this file
// contains this in fairly self-contained form to make it easier for linkers
// to strip away most of rlz. In particular, this file should not reference any
// symbols defined in financial_ping.cc.

#include "rlz/lib/rlz_lib.h"

#include "base/lazy_instance.h"
#include "rlz/lib/assert.h"
#include "rlz/lib/rlz_value_store.h"

namespace rlz_lib {

bool ClearAllProductEvents(Product product) {
  rlz_lib::ScopedRlzValueStoreLock lock;
  rlz_lib::RlzValueStore* store = lock.GetStore();
  if (!store || !store->HasAccess(rlz_lib::RlzValueStore::kWriteAccess))
    return false;

  bool result;
  result = store->ClearAllProductEvents(product);
  result &= store->ClearAllStatefulEvents(product);
  return result;
}

void ClearProductState(Product product, const AccessPoint* access_points) {
  rlz_lib::ScopedRlzValueStoreLock lock;
  rlz_lib::RlzValueStore* store = lock.GetStore();
  if (!store || !store->HasAccess(rlz_lib::RlzValueStore::kWriteAccess))
    return;

  // Delete all product specific state.
  VERIFY(ClearAllProductEvents(product));
  VERIFY(store->ClearPingTime(product));

  // Delete all RLZ's for access points being uninstalled.
  if (access_points) {
    for (int i = 0; access_points[i] != NO_ACCESS_POINT; i++) {
      VERIFY(store->ClearAccessPointRlz(access_points[i]));
    }
  }

  store->CollectGarbage();
}

static base::LazyInstance<std::string>::Leaky g_supplemental_branding;

SupplementaryBranding::SupplementaryBranding(const char* brand)
    : lock_(new ScopedRlzValueStoreLock) {
  if (!lock_->GetStore())
    return;

  if (!g_supplemental_branding.Get().empty()) {
    ASSERT_STRING("ProductBranding: existing brand is not empty");
    return;
  }

  if (brand == NULL || brand[0] == 0) {
    ASSERT_STRING("ProductBranding: new brand is empty");
    return;
  }

  g_supplemental_branding.Get() = brand;
}

SupplementaryBranding::~SupplementaryBranding() {
  if (lock_->GetStore())
    g_supplemental_branding.Get().clear();
  delete lock_;
}

// static
const std::string& SupplementaryBranding::GetBrand() {
  return g_supplemental_branding.Get();
}

}  // namespace rlz_lib
