/*
 * 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.jclouds.profitbricks.rest.domain;

import com.google.auto.value.AutoValue;
import com.google.common.base.Enums;
import static org.apache.jclouds.profitbricks.rest.util.Preconditions.checkCores;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.json.SerializedNames;

@AutoValue
public abstract class Server {

   public abstract String id();

   @Nullable
   public abstract String dataCenterId();

   public abstract String type();

   public abstract String href();

   @Nullable
   public abstract Metadata metadata();

   @Nullable
   public abstract Properties properties();

   @Nullable
   public abstract Entities entities();

   @SerializedNames({"id", "dataCenterId", "type", "href", "metadata", "properties", "entities"})
   public static Server create(String id, String dataCenterId, String type, String href, Metadata metadata, Properties properties, Entities entities) {
      return new AutoValue_Server(id, dataCenterId, type, href, metadata, properties, entities);
   }

   @AutoValue
   public abstract static class Properties {

      public abstract String name();

      public abstract int cores();

      public abstract int ram();

      @Nullable
      public abstract AvailabilityZone availabilityZone();

      @Nullable
      public abstract Server.Status vmState();

      @Nullable
      public abstract LicenceType licenceType();

      @Nullable
      public abstract Volume bootVolume();

      @Nullable
      public abstract Volume bootCdrom();

      @Nullable
      public abstract CpuFamily cpuFamily();

      @SerializedNames({"name", "cores", "ram", "availabilityZone", "vmState", "licenceType", "bootVolume", "bootCdrom", "cpuFamily"})
      public static Properties create(String name, int cores, int ram, AvailabilityZone availabilityZone, Server.Status vmState, LicenceType licenceType, Volume bootVolume, Volume bootCdrom, CpuFamily cpuFamily) {
         return new AutoValue_Server_Properties(name, cores, ram, availabilityZone, vmState, licenceType, bootVolume, bootCdrom, cpuFamily);
      }

   }

   @AutoValue
   public abstract static class Entities {

      @Nullable
      public abstract Images cdroms();

      @Nullable
      public abstract Volumes volumes();

      @Nullable
      public abstract Nics nics();

      @SerializedNames({"cdroms", "volumes", "nics"})
      public static Entities create(Images cdroms, Volumes volumes, Nics nics) {
         return new AutoValue_Server_Entities(cdroms, volumes, nics);
      }

   }

   @AutoValue
   public abstract static class BootVolume {

      public abstract String id();

      @SerializedNames({"id"})
      public static BootVolume create(String id) {
         return new AutoValue_Server_BootVolume(id);
      }

   }

   public static final class Request {

      public static CreatePayload.Builder creatingBuilder() {
         return new AutoValue_Server_Request_CreatePayload.Builder();
      }

      public static UpdatePayload.Builder updatingBuilder() {
         return new AutoValue_Server_Request_UpdatePayload.Builder();
      }

      public static AttachCdromPayload.Builder attachCdromBuilder() {
         return new AutoValue_Server_Request_AttachCdromPayload.Builder();
      }

      public static AttachVolumePayload.Builder attachVolumeBuilder() {
         return new AutoValue_Server_Request_AttachVolumePayload.Builder();
      }

      @AutoValue
      public abstract static class CreatePayload {

         public abstract String name();

         public abstract int cores();

         public abstract int ram();

         public abstract String dataCenterId();

         @Nullable
         public abstract BootVolume bootVolume();

         @Nullable
         public abstract String bootCdrom();

         @Nullable
         public abstract CpuFamily cpuFamily();

         @Nullable
         public abstract AvailabilityZone availabilityZone();

         @Nullable
         public abstract LicenceType licenceType();

         @Nullable
         public abstract Entities entities();

         @AutoValue.Builder
         public abstract static class Builder {

            public abstract Builder name(String name);

            public abstract Builder cores(int cores);

            public abstract Builder ram(int ram);

            public abstract Builder dataCenterId(String dataCenterId);

            public abstract Builder bootVolume(BootVolume bootVolume);

            public abstract Builder bootCdrom(String bootCdrom);

            public abstract Builder cpuFamily(CpuFamily cpuFamily);

            public abstract Builder availabilityZone(AvailabilityZone availabilityZone);

            public abstract Builder licenceType(LicenceType licenceType);

            public abstract Builder entities(Entities entities);

            abstract CreatePayload autoBuild();

            public CreatePayload build() {
               CreatePayload payload = autoBuild();
               checkCores(payload.cores());
               return payload;
            }
         }

      }

      @AutoValue
      public abstract static class UpdatePayload {

         public abstract String id();

         public abstract String dataCenterId();

         @Nullable
         public abstract String name();

         @Nullable
         public abstract Integer cores();

         @Nullable
         public abstract Integer ram();

         @Nullable
         public abstract BootVolume bootVolume();

         @Nullable
         public abstract Volume bootCdrom();

         @Nullable
         public abstract AvailabilityZone availabilityZone();

         @Nullable
         public abstract LicenceType licenceType();

         @AutoValue.Builder
         public abstract static class Builder {

            public abstract Builder id(String id);

            public abstract Builder dataCenterId(String dataCenterId);

            public abstract Builder name(String name);

            public abstract Builder cores(Integer cores);

            public abstract Builder ram(Integer ram);

            public abstract Builder bootVolume(BootVolume bootVolume);

            public abstract Builder bootCdrom(Volume bootCdrom);

            public abstract Builder availabilityZone(AvailabilityZone availabilityZone);

            public abstract Builder licenceType(LicenceType licenceType);

            abstract UpdatePayload autoBuild();

            public UpdatePayload build() {
               UpdatePayload payload = autoBuild();
               if (payload.cores() != null) {
                  checkCores(payload.cores());
               }
               return payload;
            }
         }
      }

      @AutoValue
      public abstract static class AttachCdromPayload {

         public abstract String imageId();

         public abstract String dataCenterId();

         public abstract String serverId();

         @AutoValue.Builder
         public abstract static class Builder {

            public abstract Builder imageId(String imageId);

            public abstract Builder dataCenterId(String dataCenterId);

            public abstract Builder serverId(String serverId);

            abstract AttachCdromPayload autoBuild();

            public AttachCdromPayload build() {
               return autoBuild();
            }
         }
      }

      @AutoValue
      public abstract static class AttachVolumePayload {

         public abstract String volumeId();

         public abstract String dataCenterId();

         public abstract String serverId();

         @AutoValue.Builder
         public abstract static class Builder {

            public abstract Builder volumeId(String volumeId);

            public abstract Builder dataCenterId(String dataCenterId);

            public abstract Builder serverId(String serverId);

            abstract AttachVolumePayload autoBuild();

            public AttachVolumePayload build() {
               return autoBuild();
            }
         }
      }
   }

   public enum Status {

      NOSTATE, RUNNING, BLOCKED, PAUSED, SHUTDOWN, SHUTOFF, CRASHED, UNRECOGNIZED;

      public String value() {
         return name();
      }

      public static Status fromValue(String v) {
         return Enums.getIfPresent(Status.class, v).or(UNRECOGNIZED);
      }
   }

}
