/*
 * 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
