/*
 * 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 <map>
#include <string>

using android::StringPiece;

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::kFont:
      return "font";
    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},
    {"font", ResourceType::kFont},
    {"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
