/*
 * 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.poppy.v1.domain;

import org.jclouds.json.SerializedNames;

import com.google.auto.value.AutoValue;

@AutoValue
public abstract class RestrictionRule {
   /**
    * @see Builder#name(String)
    */
   public abstract String getName();

   /**
    * @see Builder#httpHost(String)
    */
   public abstract String getHttpHost();

   @SerializedNames({ "name", "referrer" })
   private static RestrictionRule create(String name, String httpHost) {
      return builder().name(name).httpHost(httpHost).build();
   }

   public static Builder builder() {
      return new AutoValue_RestrictionRule.Builder();
   }

   public Builder toBuilder(){
      return builder()
            .name(getName())
            .httpHost(getHttpHost());
   }

   public static final class Builder {
      private String name;
      private String httpHost;
      Builder() {
      }
      Builder(RestrictionRule source) {
         name(source.getName());
         httpHost(source.getHttpHost());
      }

      /**
       * Required.
       * @param name Specifies the name of this rule. The minimum length for name is 1. The maximum length is 256.
       * @return The RestrictionRule builder.
       */
      public Builder name(String name) {
         this.name = name;
         return this;
      }

      /**
       * Optional.
       * @param httpHost Specifies the http host that requests must come from. The minimum length for referrer is 3.
       *                   The maximum length is 1024.
       * @return The RestrictionRule builder.
       */
      public Builder httpHost(String httpHost) {
         this.httpHost = httpHost;
         return this;
      }

      public RestrictionRule build() {
         String missing = "";
         if (name == null) {
            missing += " name";
         }
         if (httpHost == null) {
            missing += " httpHost";
         }
         if (!missing.isEmpty()) {
            throw new IllegalStateException("Missing required properties:" + missing);
         }
         RestrictionRule result = new AutoValue_RestrictionRule(
               this.name,
               this.httpHost);
         return result;
      }
   }
}
