/*
 * Copyright 2016 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "tools/UrlDataManager.h"

#include <unordered_map>
#include <vector>

UrlDataManager::UrlDataManager(SkString rootUrl) : fRootUrl(rootUrl), fDataId(0) {}

SkString UrlDataManager::addData(sk_sp<const SkData> data, const char* contentType) {
    UrlData* urlData = fCache.find(*data);
    if (urlData) {
        SkASSERT(data->equals(urlData->fData.get()));
        return urlData->fUrl;
    }

    urlData = new UrlData;
    urlData->fData = data;
    urlData->fContentType.set(contentType);
    urlData->fUrl.appendf("%s/%u", fRootUrl.c_str(), fDataId++);

    fCache.add(urlData);

    SkASSERT(!fUrlLookup.find(urlData->fUrl));
    fUrlLookup.add(urlData);
    return urlData->fUrl;
}

void UrlDataManager::reset() {
    fCache.foreach([&](UrlData* urlData) {
        urlData->unref();
    });
    fCache.rewind();
}

void UrlDataManager::indexImages(const std::vector<sk_sp<SkImage>>& images) {
    SkASSERT(imageMap.empty());  // this method meant only for initialization once.
    for (size_t i = 0; i < images.size(); ++i) {
        imageMap.insert({images[i].get(), i});
    }
}

int UrlDataManager::lookupImage(const SkImage* im) {
    auto search = imageMap.find(im);
    if (search != imageMap.end()) {
        return search->second;
    } else {
        // -1 signals the pointer to this image wasn't in the original list.
        // Maybe it was synthesized after file load? If so, you shouldn't be looking it up here.
        return -1;
    }
}
