/**
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
 */
/**
 * @file Stat.cc
 */

#include "atscppapi/Stat.h"
#include <string>
#include <stdint.h>
#include <ts/ts.h>
#include "logging_internal.h"

using namespace atscppapi;
using std::string;

Stat::Stat() : stat_id_(TS_ERROR) {
// ATS Guarantees that stat ids will always be > 0. So we can use stat_id_ > 0 to
// verify that this stat has been properly initialized.
}

Stat::~Stat() {
// we really dont have any cleanup since ATS doesn't expose a method to destroy stats
}

bool Stat::init(string name, Stat::SyncType type, bool persistent) {
  // TS_RECORDDATATYPE_INT is the only type currently supported
  // so that's why this api doesn't expose other types, TSStatSync is equivalent to StatSyncType
  stat_id_ = TSStatCreate(name.c_str(), TS_RECORDDATATYPE_INT, persistent ?  TS_STAT_PERSISTENT : TS_STAT_NON_PERSISTENT, static_cast<TSStatSync>(type));
  if (stat_id_ != TS_ERROR) {
    LOG_DEBUG("Created new stat named '%s' with stat_id = %d", name.c_str(), stat_id_);
  } else {
    LOG_ERROR("Unable to create stat named '%s'.", name.c_str());
  }

  if (stat_id_ == TS_ERROR) {
    return false;
  }

  if (!persistent) {
    set(0);
  }

  return true;
}

void Stat::set(int64_t value) {
  if (stat_id_ == TS_ERROR) {
    return;
  }

  TSStatIntSet(stat_id_, value);
}

int64_t Stat::get() const {
  if (stat_id_ == TS_ERROR) {
    return 0;
  }

  return TSStatIntGet(stat_id_);
}

void Stat::increment(int64_t amount) {
  if (stat_id_ == TS_ERROR) {
    return;
  }

  TSStatIntIncrement(stat_id_, amount);
}

void Stat::decrement(int64_t amount) {
  if (stat_id_ == TS_ERROR) {
    return;
  }

  TSStatIntDecrement(stat_id_, amount);
}





