/*
 * Copyright (C) 2015 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.
 */

#include "Resource.h"
#include "util/StringPiece.h"

#include <map>
#include <string>

namespace aapt {

StringPiece toString(ResourceType type) {
    switch (type) {
        case ResourceType::kAnim:          return "anim";
        case ResourceType::kAnimator:      return "animator";
        case ResourceType::kArray:         return "array";
        case ResourceType::kAttr:          return "attr";
        case ResourceType::kAttrPrivate:   return "^attr-private";
        case ResourceType::kBool:          return "bool";
        case ResourceType::kColor:         return "color";
        case ResourceType::kDimen:         return "dimen";
        case ResourceType::kDrawable:      return "drawable";
        case ResourceType::kFraction:      return "fraction";
        case ResourceType::kId:            return "id";
        case ResourceType::kInteger:       return "integer";
        case ResourceType::kInterpolator:  return "interpolator";
        case ResourceType::kLayout:        return "layout";
        case ResourceType::kMenu:          return "menu";
        case ResourceType::kMipmap:        return "mipmap";
        case ResourceType::kPlurals:       return "plurals";
        case ResourceType::kRaw:           return "raw";
        case ResourceType::kString:        return "string";
        case ResourceType::kStyle:         return "style";
        case ResourceType::kStyleable:     return "styleable";
        case ResourceType::kTransition:    return "transition";
        case ResourceType::kXml:           return "xml";
    }
    return {};
}

static const std::map<StringPiece, ResourceType> sResourceTypeMap {
        { "anim", ResourceType::kAnim },
        { "animator", ResourceType::kAnimator },
        { "array", ResourceType::kArray },
        { "attr", ResourceType::kAttr },
        { "^attr-private", ResourceType::kAttrPrivate },
        { "bool", ResourceType::kBool },
        { "color", ResourceType::kColor },
        { "dimen", ResourceType::kDimen },
        { "drawable", ResourceType::kDrawable },
        { "fraction", ResourceType::kFraction },
        { "id", ResourceType::kId },
        { "integer", ResourceType::kInteger },
        { "interpolator", ResourceType::kInterpolator },
        { "layout", ResourceType::kLayout },
        { "menu", ResourceType::kMenu },
        { "mipmap", ResourceType::kMipmap },
        { "plurals", ResourceType::kPlurals },
        { "raw", ResourceType::kRaw },
        { "string", ResourceType::kString },
        { "style", ResourceType::kStyle },
        { "styleable", ResourceType::kStyleable },
        { "transition", ResourceType::kTransition },
        { "xml", ResourceType::kXml },
};

const ResourceType* parseResourceType(const StringPiece& str) {
    auto iter = sResourceTypeMap.find(str);
    if (iter == std::end(sResourceTypeMap)) {
        return nullptr;
    }
    return &iter->second;
}

bool operator<(const ResourceKey& a, const ResourceKey& b) {
    return std::tie(a.name, a.config) < std::tie(b.name, b.config);
}

bool operator<(const ResourceKeyRef& a, const ResourceKeyRef& b) {
    return std::tie(a.name, a.config) < std::tie(b.name, b.config);
}

} // namespace aapt
