/*
 * 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.jclouds.openstack.nova.v2_0.domain.regionscoped;

import static com.google.common.base.Preconditions.checkNotNull;

import java.util.Collection;
import java.util.Map;

import org.jclouds.openstack.nova.v2_0.domain.SecurityGroup;
import org.jclouds.openstack.nova.v2_0.domain.TenantIdAndName;

import com.google.common.base.MoreObjects.ToStringHelper;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;

public class SecurityGroupInRegion extends RegionAndName {
   protected final SecurityGroup securityGroup;

   protected final Multimap<TenantIdAndName, SecurityGroup> groupsByName;

   public SecurityGroupInRegion(SecurityGroup securityGroup, String regionId, Iterable<SecurityGroup> allGroupsInRegion) {
      super(regionId, checkNotNull(securityGroup, "securityGroup").getName());
      this.securityGroup = securityGroup;
      this.groupsByName = HashMultimap.create();
      for (SecurityGroup groupInRegion : allGroupsInRegion) {
         final TenantIdAndName tenantIdAndName = TenantIdAndName.builder()
            .tenantId(groupInRegion.getTenantId())
            .name(groupInRegion.getName())
            .build();
         this.groupsByName.put(tenantIdAndName, groupInRegion);
      }
   }

   public SecurityGroup getSecurityGroup() {
      return securityGroup;
   }

   /**
    * Returns a map of group {@link TenantIdAndName}s to groups.
    *
    * The returned value is a collection, to take into account the possibility that certain clouds
    * may permit duplicate group names.
    *
    * @return The map of names to (collections of) groups.
    */
   public Map<TenantIdAndName, Collection<SecurityGroup>> getGroupsByName() {
       return groupsByName.asMap();
   }

   // superclass hashCode/equals are good enough, and help us use RegionAndName and SecurityGroupInRegion
   // interchangeably as Map keys

   @Override
   protected ToStringHelper string() {
      return super.string()
          .add("securityGroup", securityGroup)
          .add("groupsByName", groupsByName);
   }

   @Override
   public String toString() {
      return string().toString();
   }

}
