/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed 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.
 */

#pragma once

#include <android-modules-utils/sdk_level.h>

#include <unordered_map>

#include "HashableDimensionKey.h"

namespace android {
namespace os {
namespace statsd {

// Possible update states for a component. PRESERVE means we should keep the existing one.
// REPLACE means we should create a new one because the existing one changed
// NEW means we should create a new one because one does not currently exist.
enum UpdateStatus {
    UPDATE_UNKNOWN = 0,
    UPDATE_PRESERVE = 1,
    UPDATE_REPLACE = 2,
    UPDATE_NEW = 3,
};

const HashableDimensionKey DEFAULT_DIMENSION_KEY = HashableDimensionKey();
const MetricDimensionKey DEFAULT_METRIC_DIMENSION_KEY = MetricDimensionKey();

typedef std::map<int64_t, HashableDimensionKey> ConditionKey;

typedef std::unordered_map<MetricDimensionKey, int64_t> DimToValMap;

using ConditionLinks = google::protobuf::RepeatedPtrField<MetricConditionLink>;

using StateLinks = google::protobuf::RepeatedPtrField<MetricStateLink>;

using BinStarts = std::vector<float>;

struct Empty {};

inline bool isAtLeastS() {
    const static bool isAtLeastS = android::modules::sdklevel::IsAtLeastS();
    return isAtLeastS;
}

inline bool isAtLeastU() {
    const static bool isAtLeastU = android::modules::sdklevel::IsAtLeastU();
    return isAtLeastU;
}

inline bool shouldKeepRandomSample(int samplingPercentage) {
    return (rand() % (100) + 1) <= samplingPercentage;
}

}  // namespace statsd
}  // namespace os
}  // namespace android
