/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.ambari.server.api.resources;

import org.apache.ambari.server.api.services.Request;
import org.apache.ambari.server.api.util.TreeNode;
import org.apache.ambari.server.controller.spi.Resource;
import org.apache.ambari.server.controller.spi.Schema;
import org.apache.ambari.server.controller.utilities.ClusterControllerHelper;

import java.util.List;
import java.util.Map;
import java.util.Set;

public class ConfigGroupResourceDefinition extends BaseResourceDefinition {
  /**
   * Constructor.
   */
  public ConfigGroupResourceDefinition() {
    super(Resource.Type.ConfigGroup);
  }

  @Override
  public String getPluralName() {
    return "config_groups";
  }

  @Override
  public String getSingularName() {
    return "config_group";
  }

  @Override
  public List<PostProcessor> getPostProcessors() {
    List<PostProcessor> listProcessors = super.getPostProcessors();
    listProcessors.add(new ConfigGroupHrefProcessor());

    return listProcessors;
  }

  private class ConfigGroupHrefProcessor extends BaseHrefPostProcessor {

    @Override
    public void process(Request request, TreeNode<Resource> resultNode, String href) {
      if (resultNode.getObject().getType() == Resource.Type.ConfigGroup) {

        Resource r = resultNode.getObject();
        Schema schema = ClusterControllerHelper.getClusterController().getSchema(r.getType());
        Object clusterId = r.getPropertyValue(schema.getKeyPropertyId
          (Resource.Type.Cluster));

        Map<String, Object> configGroup = r.getPropertiesMap().get("ConfigGroup");
        String partialUrl = href.substring(0, href.indexOf("/clusters/")
          + "/clusters/".length()) + clusterId;

        for (Map.Entry<String, Object> entry : configGroup.entrySet()) {
          if (entry.getKey().contains("hosts") && entry.getValue() != null) {
            Set<Map<String, Object>> hostSet = (Set<Map<String, Object>>) entry.getValue();

            for (Map<String, Object> hostMap : hostSet) {
              String idx = partialUrl + "/hosts/" + hostMap.get("host_name");
              hostMap.put("href", idx);
            }

          } else if (entry.getKey().contains("desired_configs") && entry
            .getValue() != null) {

            Set<Map<String, Object>> configSet = (Set<Map<String,
              Object>>) entry.getValue();

            for (Map<String, Object> configMap : configSet) {
              String idx = partialUrl + "/configurations?"
                + "type=" + configMap.get("type")
                + "&tag=" + configMap.get("tag");
              configMap.put("href", idx);
            }
          }

        }
      } else {
        super.process(request, resultNode, href);
      }
    }
  }
}
