// Copyright 2020 The Dawn Authors
//
// 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.

#include "dawn_native/PersistentCache.h"

#include "common/Assert.h"
#include "dawn_native/Device.h"
#include "dawn_platform/DawnPlatform.h"

namespace dawn::native {

    PersistentCache::PersistentCache(DeviceBase* device)
        : mDevice(device), mCache(GetPlatformCache()) {
    }

    ScopedCachedBlob PersistentCache::LoadData(const PersistentCacheKey& key) {
        ScopedCachedBlob blob = {};
        if (mCache == nullptr) {
            return blob;
        }
        std::lock_guard<std::mutex> lock(mMutex);
        blob.bufferSize = mCache->LoadData(ToAPI(mDevice), key.data(), key.size(), nullptr, 0);
        if (blob.bufferSize > 0) {
            blob.buffer.reset(new uint8_t[blob.bufferSize]);
            const size_t bufferSize = mCache->LoadData(ToAPI(mDevice), key.data(), key.size(),
                                                       blob.buffer.get(), blob.bufferSize);
            ASSERT(bufferSize == blob.bufferSize);
            return blob;
        }
        return blob;
    }

    void PersistentCache::StoreData(const PersistentCacheKey& key, const void* value, size_t size) {
        if (mCache == nullptr) {
            return;
        }
        ASSERT(value != nullptr);
        ASSERT(size > 0);
        std::lock_guard<std::mutex> lock(mMutex);
        mCache->StoreData(ToAPI(mDevice), key.data(), key.size(), value, size);
    }

    dawn::platform::CachingInterface* PersistentCache::GetPlatformCache() {
        // TODO(dawn:549): Create a fingerprint of concatenated version strings (ex. Tint commit
        // hash, Dawn commit hash). This will be used by the client so it may know when to discard
        // previously cached Dawn objects should this fingerprint change.
        dawn::platform::Platform* platform = mDevice->GetPlatform();
        if (platform != nullptr) {
            return platform->GetCachingInterface(/*fingerprint*/ nullptr, /*fingerprintSize*/ 0);
        }
        return nullptr;
    }
}  // namespace dawn::native
