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

package com.google.gerrit.client.admin;

import com.google.gerrit.common.data.Permission;
import com.google.gwt.text.shared.Renderer;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

class PermissionNameRenderer implements Renderer<String> {
  private static final Map<String, String> permissions;

  static {
    permissions = new HashMap<String, String>();
    for (Map.Entry<String, String> e : Util.C.permissionNames().entrySet()) {
      permissions.put(e.getKey(), e.getValue());
      permissions.put(e.getKey().toLowerCase(), e.getValue());
    }
  }

  private final Map<String, String> fromServer;

  PermissionNameRenderer(Map<String, String> allFromOutside) {
    fromServer = allFromOutside;
  }

  @Override
  public String render(String varName) {
    if (Permission.isLabelAs(varName)) {
      return Util.M.labelAs(Permission.extractLabel(varName));
    } else if (Permission.isLabel(varName)) {
      return Util.M.label(Permission.extractLabel(varName));
    }

    String desc = permissions.get(varName);
    if (desc != null) {
      return desc;
    }

    desc = fromServer.get(varName);
    if (desc != null) {
      return desc;
    }

    desc = permissions.get(varName.toLowerCase());
    if (desc != null) {
      return desc;
    }

    desc = fromServer.get(varName.toLowerCase());
    if (desc != null) {
      return desc;
    }
    return varName;
  }

  @Override
  public void render(String object, Appendable appendable) throws IOException {
    appendable.append(render(object));
  }
}
